Maison > développement back-end > C++ > Comment récupérer efficacement des JTokens spécifiques par nom à partir d'une hiérarchie JObject ?

Comment récupérer efficacement des JTokens spécifiques par nom à partir d'une hiérarchie JObject ?

Linda Hamilton
Libérer: 2025-01-04 15:30:41
original
532 Les gens l'ont consulté

How to Efficiently Retrieve Specific JTokens by Name from a JObject Hierarchy?

Parcours de la hiérarchie JObject pour un jeton spécifique par nom

Problème :

Étant donné une réponse JSON avec une hiérarchie complexe de JTokens, comment récupérer un JToken spécifique par son nom efficacement ?

Fonction intégrée de Newtonsoft.Json :

Newtonsoft.Json fournit la méthode SelectToken(), qui permet une navigation directe vers un jeton en fonction de son chemin. Par exemple :

JToken distance = jObject.SelectToken("routes[0].legs[0].distance.text");
Copier après la connexion

Ceci récupère le JToken représentant la valeur du texte de distance.

Recherche récursive :

Si le chemin du jeton n'est pas connu ou vous devez trouver toutes les occurrences d'un jeton portant un nom donné, une recherche récursive est nécessaire. Voici une méthode d'assistance personnalisée pour la recherche récursive :

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

Utilisation :

string json = @"...", jo = JObject.Parse(json);

foreach (JToken token in jo.FindTokens("text"))
{
    Console.WriteLine(token.Path + ": " + token.ToString());
}
Copier après la connexion

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

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