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");
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); } } } }
Utilisation :
string json = @"...", jo = JObject.Parse(json); foreach (JToken token in jo.FindTokens("text")) { Console.WriteLine(token.Path + ": " + token.ToString()); }
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
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!