首页 > 后端开发 > C++ > 如何从 JObject 层次结构中按名称高效检索特定 JToken?

如何从 JObject 层次结构中按名称高效检索特定 JToken?

Linda Hamilton
发布: 2025-01-04 15:30:41
原创
507 人浏览过

How to Efficiently Retrieve Specific JTokens by Name from a JObject Hierarchy?

按名称遍历 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板