Maison > développement back-end > C++ > Comment rechercher efficacement des JTokens par nom dans une hiérarchie JObject Newtonsoft.Json ?

Comment rechercher efficacement des JTokens par nom dans une hiérarchie JObject Newtonsoft.Json ?

DDD
Libérer: 2025-01-04 13:39:39
original
455 Les gens l'ont consulté

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

Recherche d'un JToken par nom dans une hiérarchie JObject

Lorsque vous travaillez avec des données JSON à l'aide de la bibliothèque Newtonsoft.Json, des situations peuvent survenir où vous devez localiser des JTokens spécifiques dans une hiérarchie complexe de JObjects et de JArrays. Cette tâche peut devenir difficile, surtout lorsque l'emplacement du jeton cible n'est pas explicitement connu.

Fonctionnalité intégrée

Bien que la bibliothèque Newtonsoft.Json ne fournisse pas de méthode comme GetJTokenByName pour rechercher des jetons par nom, elle offre une autre manière de naviguer vers les jetons à l'aide de la méthode SelectToken. Cette méthode vous permet de parcourir la hiérarchie JObject et de sélectionner des jetons en fonction de leur chemin. Par exemple, pour obtenir la valeur du jeton de texte dans la propriété de distance imbriquée, vous pouvez utiliser la syntaxe suivante :

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

Méthode récursive pour une recherche étendue

Si vous avez besoin d'une recherche plus complète identifiant toutes les occurrences d'un jeton portant un nom donné, une méthode récursive devient nécessaire. Une telle méthode devrait explorer tous les JTokens et JArrays du JObject, y compris les structures imbriquées. Vous trouverez ci-dessous une implémentation potentielle d'une méthode de recherche récursive en 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);
            }
        }
    }
}
Copier après la connexion

Démo et sortie

Pour démontrer l'approche récursive, considérez la réponse JSON suivante :

{
    "routes": [
        {
            "bounds": {...},
            "legs": [
                {
                    "distance": { "text": "1.7 km", "value": 1729 },
                    "duration": {...}
                },
                {
                    "distance": { "text": "2.3 km", "value": 2301 },
                    "duration": {...}
                }
            ]
        }
    ]
}
Copier après la connexion

En utilisant la méthode récursive FindTokens, vous pouvez rechercher toutes les instances du texte token :

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

Cela affichera ce qui suit :

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

En utilisant des méthodes intégrées telles que SelectToken ou en implémentant un algorithme de recherche récursive, vous pouvez localiser efficacement des JTokens spécifiques dans des structures JSON complexes. Le choix de l'approche dépend de la complexité de la hiérarchie JSON et de la fréquence d'apparition du jeton cible.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal