programing

JToken의 모든 항목에 대한 액세스

muds 2023. 2. 25. 22:27
반응형

JToken의 모든 항목에 대한 액세스

다음과 같은 json 블록이 있습니다.

{
    "ADDRESS_MAP":{

        "ADDRESS_LOCATION":{
            "type":"separator",
            "name":"Address",
            "value":"",
            "FieldID":40
        },
        "LOCATION":{
            "type":"locations",
            "name":"Location",
            "keyword":{
                "1":"LOCATION1"
            },
            "value":{
                "1":"United States"
            },
            "FieldID":41
        },
        "FLOOR_NUMBER":{
            "type":"number",
            "name":"Floor Number",
            "value":"0",
            "FieldID":55
        },
        "self":{
            "id":"2",
            "name":"Address Map"
        }
    }
}

이 토큰에 포함된 모든 주요 항목을 가져오려면 어떻게 해야 합니까?예를 들어 위의 코드에서 "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" 및 "self"를 사용하고 싶습니다.

캐스트 할 수 있습니다.JToken에 대해서JObject그런 다음 를 사용합니다.Properties()메서드를 사용하여 개체 속성 목록을 가져옵니다.거기서부터 이름을 쉽게 알 수 있어요.

다음과 같은 경우:

string json =
@"{
    ""ADDRESS_MAP"":{

        ""ADDRESS_LOCATION"":{
            ""type"":""separator"",
            ""name"":""Address"",
            ""value"":"""",
            ""FieldID"":40
        },
        ""LOCATION"":{
            ""type"":""locations"",
            ""name"":""Location"",
            ""keyword"":{
                ""1"":""LOCATION1""
            },
            ""value"":{
                ""1"":""United States""
            },
            ""FieldID"":41
        },
        ""FLOOR_NUMBER"":{
            ""type"":""number"",
            ""name"":""Floor Number"",
            ""value"":""0"",
            ""FieldID"":55
        },
        ""self"":{
            ""id"":""2"",
            ""name"":""Address Map""
        }
    }
}";

JToken outer = JToken.Parse(json);
JObject inner = outer["ADDRESS_MAP"].Value<JObject>();

List<string> keys = inner.Properties().Select(p => p.Name).ToList();

foreach (string k in keys)
{
    Console.WriteLine(k);
}

출력:

ADDRESS_LOCATION
LOCATION
FLOOR_NUMBER
self

인정된 답변 외에 Newtonsoft 컬렉션에서 직접 반복하는 방법을 보여주는 답변을 드리고 싶습니다.코드 사용량이 적고 컬렉션 변환이 필요 없기 때문에 더 효율적이라고 생각합니다.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//Parse the data
JObject my_obj = JsonConvert.DeserializeObject<JObject>(your_json);

foreach (KeyValuePair<string, JToken> sub_obj in (JObject)my_obj["ADDRESS_MAP"])
{
    Console.WriteLine(sub_obj.Key);
}

JsonConvert가 자동으로 중첩된 오브젝트를 JToken(내부에는 JObject, JValue 또는 JArray)으로 역직렬화하기 때문에 이 작업을 직접 시작했습니다.

파싱은 다음 원칙에 따라 작동한다고 생각합니다.

  • 모든 오브젝트는 JToken으로 추상화됩니다.

  • 사전이 필요한 JObject에 캐스팅

  • JToken이 터미널 노드를 나타내며 값인 경우 JValue에 캐스트합니다.

  • 어레이인 경우 JArray에 캐스트

  • JValue.Value는 를 나타냅니다.필요한 NET 타입

만약 당신이 받고 있는 json의 구조를 알고 있다면, 나는 당신이 받고 있는 json의 구조를 반영하는 클래스 구조를 제안합니다.

그럼 이렇게 부르면 되겠네요

AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);

(여기서 json은 문제의 json을 포함하는 문자열입니다.)

수신한 json의 포맷을 모르는 경우는, 조금 복잡해지기 때문에, 수동으로 해석할 필요가 있습니다.

자세한 것은, http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/16795045/accessing-all-items-in-the-jtoken

반응형