首页 > 后端开发 > C++ > 如何在 Newtonsoft.Json JObject 层次结构中按名称高效搜索 JToken?

如何在 Newtonsoft.Json JObject 层次结构中按名称高效搜索 JToken?

DDD
发布: 2025-01-04 13:39:39
原创
485 人浏览过

How to Efficiently Search for JTokens by Name within a Newtonsoft.Json JObject Hierarchy?

在 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中文网其他相关文章!

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