JSON.NET Выбор элементов в массиве с помощью linq

Мне нужно выбрать некоторые значения из ответа 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();

response - это JObject из веб-запроса. Я просто верну это:

[{"Key":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]","Value":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]"}]

Результаты в конечном итоге помещаются в словарь.

Есть идеи, как это сделать? Я знаю, что это будет просто, я просто нашел правильную комбинацию.

Ответ 1

Если вы хотите получить имена всех учеников всех учителей, вы можете сделать это, например, следующим образом:

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>, просто добавьте Value<string>() в конец select. Или добавьте Values<string>(), если у вас есть первый вариант.

Но обычно лучше создавать типы для вашей объектной модели, так что вы можете работать с ними как с обычными объектами, а не как с некоторыми специальными объектами JSON.

Если у вас есть это, вы можете сделать что-то вроде:

var names = from teacher in response.TeacherHolder
            from student in teacher.Students
            select student.Name;