按名稱遍歷JObject 層次結構以查找特定令牌
問題:
給出JSON 回應對於複雜的JToken 層次結構,如何透過其檢索特定的JToken高效命名?
Newtonsoft.Json 內建函數:
Newtonsoft.Json 提供 SelectToken() 方法,該方法允許根據令牌的路徑直接導航到令牌。例如:
JToken distance = jObject.SelectToken("routes[0].legs[0].distance.text");
這將擷取表示距離文字值的 JToken。
遞歸搜尋:
如果令牌的路徑未知或您需要尋找具有給定名稱的標記的所有出現,則需要遞歸搜尋。這是用於遞歸搜索的自定義輔助方法:
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); } } } }
用法:
string json = @"...", jo = JObject.Parse(json); foreach (JToken token in jo.FindTokens("text")) { Console.WriteLine(token.Path + ": " + token.ToString()); }
輸出:
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
以上是如何從 JObject 層次結構中以名稱有效率地檢索特定 JToken?的詳細內容。更多資訊請關注PHP中文網其他相關文章!