serializeobject serialize property newtonsoft net jtoken jsonconvert json linq json.net

serialize - JSON.NET Seleccionar elementos en matriz con linq



newtonsoft json serialize vb net (1)

Necesito seleccionar algunos valores de una respuesta json. Estoy usando json.net, bien con las cosas más simples, pero no parece haber mucha documentación / tutoriales sobre nada más allá de eso. En el siguiente ejemplo de json, necesito seleccionar todas las edades:

{ "teacherHolder": [{ "id": 200000001, "name": "Mr Test", "class": "a4", "students": [{ "id": "100532469", "name": "ben" }, { "id": "100506025", "name": "bill" }, { "id": "100000447", "name": "bob" }] }]

}

He intentado esto y otras variaciones:

var stuff = response["teacherHolder"].Children()["students"]; var names = from y in stuff.Children().Values() select y["name"];

y esto:

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

la respuesta es un JObject de una webrequest. Acabo de recibir esto:

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

Los resultados finalmente se ponen en un diccionario.

¿Alguna idea de cómo hacer esto? Sé que será simple, simplemente no he encontrado la combinación correcta.


Si desea obtener los nombres de todos los alumnos de todos los profesores, puede hacerlo, por ejemplo, de la siguiente manera:

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

O, como otra opción:

var names = from teacher in response["teacherHolder"] from student in teacher["students"] select student["name"];

Si los quiere como IEnumerable<string> , simplemente agregue Value<string>() al final de la select . O agregue Values<string>() , si tiene la primera opción.

Pero generalmente es mejor crear tipos para su modelo de objetos, para que pueda trabajar con ellos como con objetos normales y no como algunos objetos JSON especiales.

Si tienes eso, podrías hacer algo como:

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