JSON.NET使用linq选择数组中的项目

gdp*_*gdp 10 linq json json.net

我需要从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"
    }]

}]
Run Code Online (Sandbox Code Playgroud)

}

我尝试了这个和其他变化:

var stuff = response["teacherHolder"].Children()["students"];

var names = from y in stuff.Children().Values()
                    select y["name"];
Run Code Online (Sandbox Code Playgroud)

还有这个:

var names= response["teacherHolder"]
            .Select(s => (string)s.SelectToken("students[0].name")).ToList();
Run Code Online (Sandbox Code Playgroud)

响应是来自webrequest的JObject.我回过头来看看:

[{"Key":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]","Value":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]"}]
Run Code Online (Sandbox Code Playgroud)

结果最终被放入字典中.

知道怎么做吗?我知道这很简单,我还没找到合适的组合.

svi*_*ick 20

如果你想得到所有老师的所有学生的名字,你可以这样做,例如:

var students = response["teacherHolder"].Children()["students"];

var names = students.Children()["name"];
Run Code Online (Sandbox Code Playgroud)

或者,作为另一种选择:

var names = from teacher in response["teacherHolder"]
            from student in teacher["students"]
            select student["name"];
Run Code Online (Sandbox Code Playgroud)

如果你想要它们IEnumerable<string>,只需添加Value<string>()到最后select.或者添加Values<string>(),如果您使用第一个选项.

但通常最好为对象模型创建类型,以便您可以像使用普通对象一样使用它们,而不是像某些特殊的JSON对象一样.

如果你有,你可以这样做:

var names = from teacher in response.TeacherHolder
            from student in teacher.Students
            select student.Name;
Run Code Online (Sandbox Code Playgroud)