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;