我需要从json响应中选择一些值。我使用的是json.net,对更简单的东西很满意,但似乎没有太多关于这方面的文档/教程。在下面的json示例中,我需要选择所有年龄:
{
"teacherHolder": [{
"id": 200000001,
"name": "Mr Test",
"class": "a4",
"students": [{
"id": "100532469",
"name": "ben"
},
{
"id": "100506025",
"name": "bill"
},
{
"id": "100000447",
"name": "bob"
}]
}]
}
我尝试过这个和其他变体:
var stuff = response["teacherHolder"].Children()["students"];
var names = from y in stuff.Children().Values()
select y["name"];
这个:
var names= response["teacherHolder"]
.Select(s => (string)s.SelectToken("students[0].name")).ToList();
响应是来自web请求的JObject。我刚得到这个:
[{"Key":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]","Value":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]"}]
结果最终被编入词典。
知道怎么做吗?我知道这会很简单,我只是没有找到合适的组合。
如果你想获得所有老师的所有学生的名字,你可以这样做,例如:
var students = response["teacherHolder"].Children()["students"];
var names = students.Children()["name"];
或者,作为另一种选择:
var names = from teacher in response["teacherHolder"]
from student in teacher["students"]
select student["name"];
如果要将它们作为IEnumerable<string>
,只需在select
的末尾添加Value<string>()
即可。或者添加Values<string>()
(如果使用第一个选项)。
但通常最好为对象模型创建类型,这样您就可以像处理普通对象一样处理它们,而不是像处理一些特殊的JSON对象那样处理它们。
如果你有,你可以做一些类似的事情:
var names = from teacher in response.TeacherHolder
from student in teacher.Students
select student.Name;