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();
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); } } } }
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": {...} } ] } ] }
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()); }
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
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!