在JObject 層次結構中按名稱搜尋JToken
使用Newtonsoft.Json 庫處理JSON 資料時,可能會出現以下情況您需要在JObject 和JArray 的複雜層次結構中找到特定的JToken。這項任務可能會變得具有挑戰性,特別是當目標令牌的位置不明確時。
內建功能
雖然Newtonsoft.Json 函式庫沒有提供特定的功能與GetJTokenByName 等方法按名稱搜尋令牌不同,但它提供了另一種使用SelectToken 方法導航到令牌的方法。此方法可讓您遍歷 JObject 層次結構並根據令牌的路徑選擇令牌。例如,要取得嵌套距離屬性中文字標記的值,可以使用以下語法:
string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();
用於擴充搜尋的遞歸方法
如果您需要更全面的搜尋來識別具有給定名稱的標記的所有出現,則需要遞歸方法。這樣的方法應該探索 JObject 中的所有 JToken 和 JArray,包括巢狀結構。以下是 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); } } } }
示範和輸出
要示範遞歸方法,請考慮以下 JSON 回應:
{ "routes": [ { "bounds": {...}, "legs": [ { "distance": { "text": "1.7 km", "value": 1729 }, "duration": {...} }, { "distance": { "text": "2.3 km", "value": 2301 }, "duration": {...} } ] } ] }
使用遞歸FindTokens方法,可以搜尋文字的所有實例token:
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
結論結論
透過使用SelectToken等內建方法或實作遞歸搜尋演算法,可以有效地在複雜的 JSON 結構中定位特定的 JToken。方法的選擇取決於 JSON 層次結構的複雜性和目標標記出現的頻率。以上是如何在 Newtonsoft.Json JObject 層次結構中按名稱高效搜尋 JToken?的詳細內容。更多資訊請關注PHP中文網其他相關文章!