如何从JSON字符串获取深层嵌套属性?

如何使用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

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

您可以使用JToken.SelectTokens()来实现此目的。 它允许使用通配符和使用JSONPath语法的递归搜索来查询JSON:

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

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

原型小提琴 。

如果"myThings[*]"的数组条目对应于某些POCO MyThing ,则可以在查询后使用JToken.ToObject()对它们进行反序列化:

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