如何从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();