2012-05-10 17 views
65

Sto provando a determinare come accedere ai dati contenuti nel mio JObject e non riesco a determinare come usarlo per tutta la vita.Come faccio a numerare attraverso un JObject?

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

posso stampare alla console fare Console.WriteLine (Object) e vedere i dati, sembra che:

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

ma non ho idea di come iterare solo/enumerare qualcuno ha qualche idea? Sono così in perdita adesso.

risposta

103

Se si guarda su the documentation for JObject, si vedrà che implementa IEnumerable<KeyValuePair<string, JToken>>. Quindi, è possibile scorrere su di esso semplicemente utilizzando un foreach:

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

Questo è corretto, ma per motivi che non capisco, non è possibile utilizzarlo con Linq a meno che non si esegua il cast esplicito sul tipo enumerabile. Cioè you '((IEnumerable >) obj) .Select (...)' invece di plain-old 'obj.Select (...)'; o almeno questo è quello che ho trovato una parte del mio codice. –

+1

@AdrianRatnapala Il tuo oggetto è dichiarato dinamico? I metodi di estensione (come Enumerable.Select) non funzionano con questo. – svick

+1

No, nel mio caso 'obj' aveva tipo' JObject'; ma 'JObject' sembra avere problemi simili a' dynamic'. Il compilatore non può inferire gli argomenti di tipo a '.Seleziona'. Posso darli esplicitamente, 'obj.Select , (tipo di risultato)> (...)' funziona anche per me –

8

La risposta non ha funzionato per me. Non so come abbia ottenuto tanti voti. Anche se mi ha aiutato a indicarmi una direzione.

Questa è la risposta che ha funzionato per me:

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

Con quello (dopo questa riga: JObject priceComplianceJson = JObject.Parse (File.ReadAllText (fullPath));) Ottengo, "Impossibile convertire il tipo 'System.Collections.Generic.KeyValuePair 'a' Newtonsoft.Json.Linq.JProperty '" Rimuovere la fusione funziona, tuttavia: var key = x.Key; var jvalue = x.Valore; - almeno compila ... ceco la funzionalità domani. –

26

JObjects possono essere enumerati tramite JProperty oggetti da lanciare ad un JToken:

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

Se si dispone di un jobject nidificato all'interno di un altro JObject, non è necessario eseguire il cast perché l'accessor restituirà 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

Grazie per questa informazione utile! – SimplyInk

+1

Si può anche usare comodamente linq in questo modo: 'obj.Properties(). Select (p => p.Name +": "+ p.Value)'. – itslittlejohn

Problemi correlati