Home >Backend Development >C++ >How to Efficiently Search for JTokens by Name within a Newtonsoft.Json JObject Hierarchy?

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

DDD
DDDOriginal
2025-01-04 13:39:39452browse

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

Searching for a JToken by Name in a JObject Hierarchy

When working with JSON data using the Newtonsoft.Json library, there may arise situations where you need to locate specific JTokens within a complex hierarchy of JObjects and JArrays. This task can become challenging, especially when the target token's location is not explicitly known.

Built-In Functionality

While the Newtonsoft.Json library does not provide a specific method like GetJTokenByName for searching tokens by name, it offers an alternative way to navigate to tokens using the SelectToken method. This method enables you to traverse the JObject hierarchy and select tokens based on their path. For instance, to obtain the value of the text token in the nested distance property, you can use the following syntax:

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

Recursive Method for Extensive Searching

If you require a more comprehensive search that identifies all occurrences of a token with a given name, a recursive method becomes necessary. Such a method should explore all JTokens and JArrays within the JObject, including nested structures. Below is a potential implementation of a recursive search method in C#:

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);
            }
        }
    }
}

Demo and Output

To demonstrate the recursive approach, consider the following JSON response:

{
    "routes": [
        {
            "bounds": {...},
            "legs": [
                {
                    "distance": { "text": "1.7 km", "value": 1729 },
                    "duration": {...}
                },
                {
                    "distance": { "text": "2.3 km", "value": 2301 },
                    "duration": {...}
                }
            ]
        }
    ]
}

Using the recursive FindTokens method, you can search for all instances of the text token:

foreach (JToken token in jo.FindTokens("text"))
{
    Console.WriteLine(token.Path + ": " + token.ToString());
}

This will output the following:

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

Conclusion

By utilizing built-in methods like SelectToken or implementing a recursive search algorithm, you can effectively locate specific JTokens within complex JSON structures. The choice of approach depends on the complexity of the JSON hierarchy and the frequency of the target token's occurrence.

The above is the detailed content of How to Efficiently Search for JTokens by Name within a Newtonsoft.Json JObject Hierarchy?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn