2012-05-10 13 views
65

Estoy tratando de determinar cómo acceder a los datos que están en mi JObject y no puedo determinar cómo usarlo.¿Cómo puedo enumerar a través de JObject?

JObject Object = (JObject)Response.Data["my_key"]; 

puedo imprimir a la consola haciendo Console.WriteLine (Objeto) y veo los datos, parece que:

{ 
"my_data" : "more of my string data" 
... 
} 

pero no tengo ni idea de cómo simplemente iterar/enumerar es, alguien tiene alguna idea? Estoy tan perdido ahora.

Respuesta

103

Si mira the documentation for JObject, verá que implementa IEnumerable<KeyValuePair<string, JToken>>. Por lo tanto, se puede iterar sobre ella el simple uso de un foreach:

foreach (var x in obj) 
{ 
    string name = x.Key; 
    JToken value = x.Value; 
    … 
} 
+3

Esto es correcto, pero por razones que no entiendo, no puede usarlo con Linq a menos que lo haga explícitamente al tipo enumerable. Es decir. you '((IEnumerable >) obj) .Seleccione (...)' en lugar de plain-old 'obj.Select (...)'; o al menos eso es lo que encontré una parte de mi código. –

+1

@AdrianRatnapala ¿Su obj está declarado dinámico? Los métodos de extensión (como Enumerable.Select) no funcionan con eso. – svick

+1

No, en mi caso 'obj' tenía el tipo' JObject'; pero 'JObject' parece tener problemas similares a' dynamic'. El compilador no puede inferir los argumentos de tipo para '.Select'. Puedo darles explícitamente, 'obj.Select , (tipo de resultado)> (...)' también funciona para mí –

8

La respuesta no funcionó para mí. No sé cómo obtuvo tantos votos. Aunque ayudó a apuntarme en una dirección.

Esta es la respuesta que trabajó para mí:

foreach (var x in jobj) 
{ 
    var key = ((JProperty) (x)).Name; 
    var jvalue = ((JProperty)(x)).Value ; 
} 
+1

Con eso (después de esta línea: JObject priceComplianceJson = JObject.Parse (File.ReadAllText (fullPath));) Obtengo, "No se puede convertir el tipo 'System.Collections.Generic.KeyValuePair 'a' Newtonsoft.Json.Linq.JProperty '" Sin embargo, eliminar los trabajos de fundición: var key = x.Key; var jvalue = x.Value; - al menos compila ... Chequearé la funcionalidad mañana. –

26

JObjects se pueden enumerar a través de JProperty objetos echándola por un JToken:

foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject 
    string name = x.Name; 
    JToken value = x.Value; 
} 

Si usted tiene un jobject anidada dentro de otra JObject, no necesita lanzar porque el acceso devuelve un JToken:

foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects 
    string name = x.Name; 
    JToken value = x.Value; 
} 
+2

¡Gracias por esta información útil! – SimplyInk

+1

También puede usar linq como lo siguiente: 'obj.Properties(). Select (p => p.Name +": "+ p.Value)'. – itslittlejohn

Cuestiones relacionadas