如何使用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" } } } }
我遇到的一些困难:
可以帮助您的另一个考虑因素:我确实有一个静态类来表示myThings数组中的内容,所以我的理想返回值是 IEnumerable<MyThing>
IEnumerable<MyThing>
我的第一个尝试是使用,JsonConvert.DeserializeObject<dynamic>(json)但是我不知道如何处理上面提到的问题。最后,我不需要整个JSON字符串的全部数据,只需要一个名为“ myThings”的数组即可。
JsonConvert.DeserializeObject<dynamic>(json)
您可以JToken.SelectTokens()用于此目的。它允许使用通配符查询JSON和使用JSONPath语法进行递归搜索:
JToken.SelectTokens()
var root = JToken.Parse(json); var myThings = root.SelectTokens("..myThings[*]").ToList();
这".."是 递归下降 运算符,"myThings[*]"表示返回属性的所有数组项"myThings"。
".."
"myThings[*]"
"myThings"
原型小提琴。
如果的数组条目"myThings[*]"对应于某个POCO MyThing,则可以JToken.ToObject<T>()在查询后使用反序列化它们:
MyThing
JToken.ToObject<T>()
var myThings = root.SelectTokens("..myThings[*]").Select(t => t.ToObject<MyThing>()).ToList();