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
Libérer: 2025-01-01 07:38:11
original
430 Les gens l'ont consulté

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

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

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

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

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