Maison >développement back-end >C++ >Comment puis-je rechercher efficacement un JToken spécifique par son nom dans une hiérarchie JObject imbriquée en C# à l'aide de Newtonsoft.Json ?

Comment puis-je rechercher efficacement un JToken spécifique par son nom dans une hiérarchie JObject imbriquée en C# à l'aide de Newtonsoft.Json ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-01 07:38:11412parcourir

How can I efficiently search for a specific JToken by name within a nested JObject hierarchy in C# using Newtonsoft.Json?

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

Lorsque vous travaillez avec des données JSON en C#, la bibliothèque Newtonsoft.Json fournit divers méthodes pour interagir avec JObjects et JTokens. Si vous devez récupérer un JToken spécifique par son nom à partir d'une hiérarchie JObject, vous vous demandez peut-être s'il existe une fonction intégrée qui peut simplifier cette tâche.

Utilisation de SelectToken() pour la navigation par jeton spécifique

Si vous connaissez le chemin exact du JToken que vous souhaitez récupérer, la méthode SelectToken() fournit un moyen direct d'y accéder. Par exemple :

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

Dans cet exemple, nous récupérons le JToken « texte » de la propriété distance imbriquée dans le premier tronçon de la première route.

Implémentation d'une recherche récursive pour tous les jetons

Si vous avez besoin de trouver toutes les occurrences d'un JToken avec un nom donné quel que soit son emplacement dans le JObject hiérarchie, vous devrez implémenter une méthode de recherche récursive. Voici une approche :

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

Cette méthode peut être utilisée comme suit :

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

La sortie résultante affichera le chemin et la valeur de tous les JTokens portant le nom « texte ». Par exemple :

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

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