在 JObject 层次结构中按名称定位 JToken
为了响应从复杂 JSON 响应中检索特定 JToken 的需求,本文提出了讨论NewtonsoftJson 库中的可用选项,并以递归的形式提供替代解决方案
NewtonsoftJson SelectToken 方法
虽然 NewtonsoftJson 库不提供按名称搜索 JToken 的直接方法,但它提供了 SelectToken() 方法。此方法允许您浏览 JObject 层次结构并根据令牌的路径选择令牌。例如,要从提供的 JSON 响应中检索“文本”JToken:
JObject jObject = JObject.Parse(json); string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();
递归令牌搜索方法
如果您需要查找所有出现的 JToken无论其位置如何,都具有特定的名称,因此需要递归方法。这是一个示例:
public static class JsonExtensions { public static List<JToken> FindTokens(this JToken containerToken, string name) { // Initialize a list to store matching JTokens List<JToken> matches = new List<JToken>(); // Call the recursive helper method FindTokens(containerToken, name, matches); // Return the matches return matches; } private static void FindTokens(JToken containerToken, string name, List<JToken> matches) { // Recursively traverse the JObject and JArray elements switch (containerToken.Type) { case JTokenType.Object: // Check JProperties for the name and recurse on their values foreach (JProperty child in containerToken.Children<JProperty>()) { if (child.Name == name) { matches.Add(child.Value); } FindTokens(child.Value, name, matches); } break; case JTokenType.Array: // Recurse on each element of the array foreach (JToken child in containerToken.Children()) { FindTokens(child, name, matches); } break; } } }
演示和输出
这是一个示例演示:
// Load the JSON response string json = GetJson(); // Parse the JSON into a JObject JObject jo = JObject.Parse(json); // Find all "text" JTokens using the FindTokens method 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() 方法提供了一种便捷的方法来导航 JObject 中的特定路径,但递归 FindTokens 方法提供了用于查找具有给定名称的 JToken 的所有出现的解决方案,无论其在层次结构中的位置如何。这些方法之间的选择取决于您应用程序的具体要求。
以上是如何在嵌套 JObject 层次结构中按名称有效定位 JToken?的详细内容。更多信息请关注PHP中文网其他相关文章!