名前による特定のトークンの 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 中国語 Web サイトの他の関連記事を参照してください。