【问题标题】:How do I get a deeply-nested property from JSON string?如何从 JSON 字符串中获取深度嵌套的属性?
【发布时间】:2016-07-19 09:08:47
【问题描述】:

如何使用 JSON.NET 从 JSON 中获取“myThings”数组,如下所示?

示例 1:

{
    "z": {
        "a": 1,
        "b": 2
    },
    "something": {
        "y": [1, 2],
        "somethingElse": {
            "1234": {
                "foo": "bar",
                "myThings": [{
                    "name": "bob",
                    "age": 3
                }, {
                    "name": "bob",
                    "age": 3
                }]
            }
        }
    }
}

示例 2:

{
    "z": {
        "a": 1,
        "b": 2
    },
    "something": {
        "y": [1, 2],
        "somethingElse": {
            "7890": {
                "foo": "bar"
            }
        }
    }
}

我遇到困难的几件事:

  • 其中一个属性名称是一个不可预测的数字(“1234”和“7890”)
  • 有时“myThings”数组不存在 - 在这种情况下,我想要的是 null 或空数组/集合

另一个对您有帮助的考虑:我确实有一个静态类来表示 myThings 数组中的东西,所以我的理想返回值是IEnumerable<MyThing>

我的第一次尝试是使用JsonConvert.DeserializeObject<dynamic>(json),但我不知道如何处理我上面提到的问题。最后,我不需要整个 JSON 字符串的数据,只需要名为“myThings”的内部数组。

【问题讨论】:

  • “不可预测”是什么意思? somethingElse 是否只包含带有某个数字键的单个属性?
  • “不可预测”是指作为对象名称的数字始终是不同的数字。在我的示例中,我指的是数字“1234”和“7890”。
  • 对,我知道它可以改变,但是你对数据结构还有什么了解?你能不能总是做类似something.somethingElse 这样的事情,然后那将是里面唯一的关键?
  • 结构的唯一变化是数字的变化,myThings 对象有时不存在。结构的其余部分是可预测的。所以是的,something.somethingElse 总是在那里,里面有一个以数字命名的项目。只是那个以数字命名的项目可能包含也可能不包含数组。

标签: c# json json.net


【解决方案1】:

您可以为此目的使用JToken.SelectTokens()。它允许使用通配符查询 JSON 并使用 JSONPath syntax 进行递归搜索:

var root = JToken.Parse(json);
var myThings = root.SelectTokens("..myThings[*]").ToList();

这里".."递归下降运算符,"myThings[*]"表示返回属性"myThings"的所有数组项。

原型fiddle

如果"myThings[*]"的数组条目对应一些POCOMyThing,查询后可以使用JToken.ToObject<T>()反序列化:

    var myThings = root.SelectTokens("..myThings[*]").Select(t => t.ToObject<MyThing>()).ToList();

【讨论】:

  • 做到了!我唯一需要调整的是最后我有root.SelectTokens("..myThings[*]").Select(x =&gt; new {name= x["name"].ToString(), age=(int)x["age"]});。谢谢你。 :-)
  • 我更喜欢你的添加而不是我的调整。 ToObject 效果更好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多