> 백엔드 개발 > C++ > Newtonsoft.Json JObject 계층 구조 내에서 이름으로 JToken을 효율적으로 검색하는 방법은 무엇입니까?

Newtonsoft.Json JObject 계층 구조 내에서 이름으로 JToken을 효율적으로 검색하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-04 13:39:39
원래의
549명이 탐색했습니다.

How to Efficiently Search for JTokens by Name within a Newtonsoft.Json JObject Hierarchy?

JObject 계층 구조에서 이름으로 JToken 검색

Newtonsoft.Json 라이브러리를 사용하여 JSON 데이터로 작업할 때 상황이 발생할 수 있습니다. JObject 및 JArray의 복잡한 계층 내에서 특정 JToken을 찾아야 하는 경우. 이 작업은 특히 대상 토큰의 위치가 명시적으로 알려지지 않은 경우 어려울 수 있습니다.

내장 기능

Newtonsoft.Json 라이브러리는 특정 토큰을 제공하지 않습니다. 이름으로 토큰을 검색하기 위한 GetJTokenByName과 같은 메서드는 SelectToken 메서드를 사용하여 토큰을 탐색하는 대체 방법을 제공합니다. 이 방법을 사용하면 JObject 계층 구조를 탐색하고 해당 경로에 따라 토큰을 선택할 수 있습니다. 예를 들어 중첩된 거리 속성의 텍스트 토큰 값을 얻으려면 다음 구문을 사용할 수 있습니다.

1

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

로그인 후 복사

광범위한 검색을 위한 재귀 방법

특정 이름을 가진 모든 토큰을 식별하는 보다 포괄적인 검색이 필요한 경우 재귀적 방법이 필요합니다. 이러한 메소드는 중첩된 구조를 포함하여 JObject 내의 모든 JToken 및 JArray를 탐색해야 합니다. 다음은 C#에서 재귀 검색 방법의 잠재적 구현입니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

public static class JsonExtensions

{

    public static List<JToken> FindTokens(this JToken containerToken, string name)

    {

        List<JToken> matches = new List<JToken>();

        FindTokens(containerToken, name, matches);

        return matches;

    }

 

    private static void FindTokens(JToken containerToken, string name, List<JToken> matches)

    {

        if (containerToken.Type == JTokenType.Object)

        {

            foreach (JProperty child in containerToken.Children<JProperty>())

            {

                if (child.Name == name)

                {

                    matches.Add(child.Value);

                }

                FindTokens(child.Value, name, matches);

            }

        }

        else if (containerToken.Type == JTokenType.Array)

        {

            foreach (JToken child in containerToken.Children())

            {

                FindTokens(child, name, matches);

            }

        }

    }

}

로그인 후 복사

데모 및 출력

재귀 접근 방식을 시연하려면 다음 JSON 응답을 고려하세요.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

{

    "routes": [

        {

            "bounds": {...},

            "legs": [

                {

                    "distance": { "text": "1.7 km", "value": 1729 },

                    "duration": {...}

                },

                {

                    "distance": { "text": "2.3 km", "value": 2301 },

                    "duration": {...}

                }

            ]

        }

    ]

}

로그인 후 복사

재귀적인 FindTokens 메소드를 사용하면 텍스트의 모든 인스턴스를 검색할 수 있습니다. 토큰:

1

2

3

4

foreach (JToken token in jo.FindTokens("text"))

{

    Console.WriteLine(token.Path + ": " + token.ToString());

}

로그인 후 복사

다음과 같이 출력됩니다.

1

2

3

4

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과 같은 내장 메소드를 활용하거나 재귀 검색 알고리즘을 사용하면 복잡한 JSON 구조 내에서 특정 JToken을 효과적으로 찾을 수 있습니다. 접근 방식의 선택은 JSON 계층 구조의 복잡성과 대상 토큰의 발생 빈도에 따라 달라집니다.

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿