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
Libérer: 2025-01-03 17:15:39
original
298 Les gens l'ont consulté

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();
Copier après la connexion

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;
        }
    }
}
Copier après la connexion

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());
}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal