Maison >développement back-end >C++ >Comment localiser efficacement les JTokens par nom dans les hiérarchies JObject imbriquées ?

Comment localiser efficacement les JTokens par nom dans les hiérarchies JObject imbriquées ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-03 17:15:39312parcourir

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

Localisation des JTokens par nom dans les hiérarchies JObject

En réponse au besoin de récupérer des JTokens spécifiques à partir de réponses JSON complexes, cet article présente une discussion sur les options disponibles au sein de la bibliothèque NewtonsoftJson et propose une solution alternative sous la forme d'un fichier récursif méthode.

Méthode NewtonsoftJson SelectToken

Bien que la bibliothèque NewtonsoftJson n'offre pas de méthode directe pour rechercher des JTokens par nom, elle fournit la méthode SelectToken(). Cette méthode vous permet de naviguer dans la hiérarchie JObject et de sélectionner les jetons en fonction de leur chemin. Par exemple, pour récupérer le JToken « texte » à partir de la réponse JSON fournie :

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

Méthode de recherche de jeton récursive

Si vous avez besoin de trouver toutes les occurrences d'un JToken avec un nom précis quel que soit son emplacement, une méthode récursive est nécessaire. Voici un exemple :

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

Démo et sortie

Voici un exemple de démonstration :

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

Ce code imprime ce qui suit sortie :

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

Bien que la méthode SelectToken() intégrée fournisse un moyen pratique de parcourir des chemins spécifiques dans un JObject, la méthode récursive FindTokens propose une solution pour trouver toutes les occurrences d'un JToken avec un nom donné, quel que soit son emplacement dans la hiérarchie. Le choix entre ces approches dépend des exigences spécifiques de votre application.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn