Suche nach einem JToken anhand des Namens in einer JObject-Hierarchie
Beim Arbeiten mit JSON-Daten mithilfe der Newtonsoft.Json-Bibliothek können Situationen auftreten Hier müssen Sie bestimmte JTokens innerhalb einer komplexen Hierarchie von JObjects und JArrays finden. Diese Aufgabe kann zu einer Herausforderung werden, insbesondere wenn der Standort des Ziel-Tokens nicht explizit bekannt ist.
Eingebaute Funktionalität
Während die Newtonsoft.Json-Bibliothek keine spezifische Funktion bereitstellt Obwohl Sie eine Methode wie GetJTokenByName zum Suchen von Token nach Namen verwenden, bietet sie eine alternative Möglichkeit, mithilfe der SelectToken-Methode zu Token zu navigieren. Mit dieser Methode können Sie die JObject-Hierarchie durchlaufen und Token basierend auf ihrem Pfad auswählen. Um beispielsweise den Wert des Text-Tokens in der verschachtelten Distanzeigenschaft zu erhalten, können Sie die folgende Syntax verwenden:
string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();
Rekursive Methode für umfangreiche Suche
Wenn Sie eine umfassendere Suche benötigen, die alle Vorkommen eines Tokens mit einem bestimmten Namen identifiziert, ist eine rekursive Methode erforderlich. Eine solche Methode sollte alle JTokens und JArrays innerhalb des JObjects untersuchen, einschließlich verschachtelter Strukturen. Nachfolgend finden Sie eine mögliche Implementierung einer rekursiven Suchmethode in 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); } } } }
Demo und Ausgabe
Um den rekursiven Ansatz zu demonstrieren, betrachten Sie die folgende JSON-Antwort:
{ "routes": [ { "bounds": {...}, "legs": [ { "distance": { "text": "1.7 km", "value": 1729 }, "duration": {...} }, { "distance": { "text": "2.3 km", "value": 2301 }, "duration": {...} } ] } ] }
Mit der rekursiven FindTokens-Methode können Sie nach allen Vorkommen des Textes suchen Token:
foreach (JToken token in jo.FindTokens("text")) { Console.WriteLine(token.Path + ": " + token.ToString()); }
Dies gibt Folgendes aus:
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
Fazit
Durch die Verwendung integrierter Methoden wie SelectToken oder die Implementierung eines Mithilfe des rekursiven Suchalgorithmus können Sie bestimmte JTokens effektiv in komplexen JSON-Strukturen finden. Die Wahl des Ansatzes hängt von der Komplexität der JSON-Hierarchie und der Häufigkeit des Auftretens des Ziel-Tokens ab.
Das obige ist der detaillierte Inhalt vonWie kann man innerhalb einer Newtonsoft.Json JObject-Hierarchie effizient nach JTokens nach Namen suchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!