【问题标题】:Get deeply nested object from JSON [duplicate]从 JSON 中获取深度嵌套的对象 [重复]
【发布时间】:2017-12-08 15:06:55
【问题描述】:

基本上,我正在使用 HTMLAgilityPack 进行一些网络抓取,我得到一个巨大的 json 作为字符串,然后我使用 json.net 包将其转换为 JObject

现在在JObject 的某个深处,有一些我想要的对象。但由于它嵌套非常深,我想知道是否真的有办法到达这些对象,不知道它们在JObject 中的确切位置。我只知道他们的名字。有什么方法可以让我在整个JObject 中进行某种搜索,只知道我正在寻找的对象/属性名称?

遗憾的是,我找不到任何可以使用的相关问题/记录在案的方法。

【问题讨论】:

  • 你可以写一个DFS,或者使用.Descendants()
  • 用递归编写一个方法,不断迭代对象的每一层,直到找到你的值。显然,一个表示数据并利用它的模型会容易得多。 Visual Studio 甚至有一个“Paste Special”来创建一个基于 JSON 构建的类。
  • 你可以使用.Children()手动遍历未知的json,见this answer
  • 除了@Sinatr 答案之外,您还可以在使用递归的方法中使用.Childeren()。这样你也可以骑车去找他们的孩子,以防他们有任何孩子。
  • 您可以使用SelectTokens()How do I get a deeply-nested property from JSON string? 中所示的合适的JSONPath 表达式,也可以使用Searching for a specific JToken by name in a JObject hierarchy 中所示的递归方法

标签: c# json.net


【解决方案1】:

这可能对你有用:

private JToken GetValueByKey(JObject jObject, string key)
{
    foreach (KeyValuePair<string, JToken> jProperty in jObject)
    {
        if (jProperty.Key.Equals(key))
        {
            return jProperty.Value;
        }
        else if (jProperty.Value is JObject)
        {
            return GetValueByKey((JObject)jProperty.Value, key);
        }
    }
    return null;
}

它需要你想要搜索的 JObject 和你想要搜索的键。 它映射 JObject 中的所有属性以查看或匹配键,如果不匹配,它将检查或当前属性可以转换为 JObject。如果可以将其转换为 JObject,它将检查所有 JObjects 值或您的键匹配。

如果找到匹配项,它将返回与您的键匹配的值。

如果循环遍历 JObject 中的所有属性后未找到匹配项,它将返回 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2021-07-18
    相关资源
    最近更新 更多