>백엔드 개발 >C++ >중첩된 JObject 계층 내에서 이름으로 JToken을 효율적으로 찾는 방법은 무엇입니까?

중첩된 JObject 계층 내에서 이름으로 JToken을 효율적으로 찾는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-03 17:15:39278검색

How to Efficiently Locate JTokens by Name within Nested JObject Hierarchies?

JObject 계층 구조에서 이름으로 JToken 찾기

복잡한 JSON 응답에서 특정 JToken을 검색해야 하는 필요성에 대한 응답으로 이 문서에서는 토론을 제시합니다. NewtonsoftJson 라이브러리 내에서 사용 가능한 옵션에 대해 설명하고 재귀 형식으로 대체 솔루션을 제공합니다. method.

NewtonsoftJson SelectToken 메서드

NewtonsoftJson 라이브러리는 JToken을 이름으로 검색하는 직접적인 방법을 제공하지 않지만 SelectToken() 메서드는 제공합니다. 이 방법을 사용하면 JObject 계층 구조를 탐색하고 해당 경로에 따라 토큰을 선택할 수 있습니다. 예를 들어, 제공된 JSON 응답에서 "텍스트" JToken을 검색하려면:

JObject jObject = JObject.Parse(json);
string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();

재귀 토큰 검색 방법

JToken의 모든 항목을 찾아야 하는 경우 위치에 관계없이 특정 이름을 사용하는 경우 재귀적인 방법이 필요합니다. 예는 다음과 같습니다.

public static class JsonExtensions
{
    public static List<JToken> FindTokens(this JToken containerToken, string name)
    {
        // Initialize a list to store matching JTokens
        List<JToken> matches = new List<JToken>();

        // Call the recursive helper method
        FindTokens(containerToken, name, matches);

        // Return the matches
        return matches;
    }

    private static void FindTokens(JToken containerToken, string name, List<JToken> matches)
    {
        // Recursively traverse the JObject and JArray elements
        switch (containerToken.Type)
        {
            case JTokenType.Object:
                // Check JProperties for the name and recurse on their values
                foreach (JProperty child in containerToken.Children<JProperty>())
                {
                    if (child.Name == name)
                    {
                        matches.Add(child.Value);
                    }
                    FindTokens(child.Value, name, matches);
                }
                break;
            case JTokenType.Array:
                // Recurse on each element of the array
                foreach (JToken child in containerToken.Children())
                {
                    FindTokens(child, name, matches);
                }
                break;
        }
    }
}

데모 및 출력

샘플 데모는 다음과 같습니다.

// Load the JSON response
string json = GetJson();

// Parse the JSON into a JObject
JObject jo = JObject.Parse(json);

// Find all "text" JTokens using the FindTokens method
foreach (JToken token in jo.FindTokens("text"))
{
    Console.WriteLine(token.Path + ": " + token.ToString());
}

이 코드는 다음을 인쇄합니다. 출력:

routes[0].legs[0].distance.text: 1.7 km
routes[0].legs[0].duration.text: 4 mins
routes[0].legs[1].distance.text: 2.3 km
routes[0].legs[1].duration.text: 5 mins

결론

내장된 SelectToken() 메서드는 JObject의 특정 경로를 탐색하는 편리한 방법을 제공하는 반면 재귀적인 FindTokens 메서드는 다음을 제공합니다. 계층 구조 내의 위치에 관계없이 주어진 이름을 가진 모든 JToken을 찾는 솔루션입니다. 이러한 접근 방식 중 선택은 애플리케이션의 특정 요구 사항에 따라 달라집니다.

위 내용은 중첩된 JObject 계층 내에서 이름으로 JToken을 효율적으로 찾는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.