2012-04-02 20 views
10

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 ejemplo de JSON a continuación necesito para seleccionar todas las edades:JSON.NET Selección de elementos en la matriz con linq

{ 
"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 volver esto:

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

Los resultados son finalmente pusieron en un diccionario.

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

Respuesta

20

Si desea obtener los nombres de todos los estudiantes de todos los maestros, lo puede hacer, por ejemplo, así:

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 quieren ellos como IEnumerable<string>, simplemente agregue Value<string>() al final de 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 usted tiene que, usted podría hacer algo como:

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

Hola svick im usando el primer método - Pero estoy de vuelta es: {Newtonsoft.Json.Linq.JEnumerable } en la variable de nombres? – gdp

+1

Sí, es por eso que dije que necesitas agregar 'Valores ()' si quieres una colección de 'string's. – svick

+1

Hola svick he agregado los valores () hasta el final. es ahora: var names = students.Children() ["name"]. Valores (); – gdp

Cuestiones relacionadas