首页 > 后端开发 > C++ > 如何在嵌套 JObject 层次结构中按名称有效定位 JToken?

如何在嵌套 JObject 层次结构中按名称有效定位 JToken?

Linda Hamilton
发布: 2025-01-03 17:15:39
原创
254 人浏览过

How to Efficiently Locate JTokens by Name within Nested JObject Hierarchies?

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

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