Come posso analizzare un object JSON in C # quando non conosco la chiave in anticipo?

Ho alcuni dati JSON che assomigliano a questo:

{ "910719": { "id": 910719, "type": "asdf", "ref_id": 7568 }, "910721": { "id": 910721, "type": "asdf", "ref_id": 7568 }, "910723": { "id": 910723, "type": "asdf", "ref_id": 7568 } } 

Come posso analizzare questo utilizzando JSON.net? Posso prima farlo:

 JObject jFoo = JObject.Parse(data); 

Devo essere in grado di scorrere su ogni object in questo elenco. Mi piacerebbe essere in grado di fare qualcosa del genere:

 foreach (string ref_id in (string)jFoo["ref_id"]) {...} 

o

 foreach (JToken t in jFoo.Descendants()) { Console.WriteLine((string)t["ref_id"]); } 

ma ovviamente questo non funziona. Tutti gli esempi funzionano alla grande se conosci la chiave mentre scrivi il tuo codice. Si rompe quando non si conosce la chiave in anticipo.

È fattibile; questo funziona ma non è elegante. Sono sicuro che c’è un modo migliore.

 var o = JObject.Parse(yourJsonString); foreach (JToken child in o.Children()) { foreach (JToken grandChild in child) { foreach (JToken grandGrandChild in grandChild) { var property = grandGrandChild as JProperty; if (property != null) { Console.WriteLine(property.Name + ":" + property.Value); } } } } 

stampe:

  id: 910.719
 Tipo: asdf
 ref_id: 7568
 id: 910.721
 Tipo: asdf
 ref_id: 7568
 id: 910723
 Tipo: asdf
 ref_id: 7568 

Puoi scorrere i discendenti con una semplice query LINQ come questa:

 JObject jFoo = JObject.Parse(json); foreach (JObject obj in jFoo.Properties().Select(p => p.Value)) { Console.WriteLine("id: " + obj["id"]); Console.WriteLine("ref_id: " + obj["ref_id"]); } 

Allo stesso modo, se desideri solo i valori ref_id , puoi ottenere quelli come questo:

 foreach (string refId in jFoo.Properties().Select(p => p.Value["ref_id"])) { Console.WriteLine(refId); } 

Sto usando Json.NET e ho scritto un modo rapido in cui è ansible stampare tutte le chiavi e i valori corrispondenti utilizzando un metodo ricorsivo.

  var o = JObject.Parse(YourJsonString); getAllProperties(o); //call our recursive method 

Quindi è ansible utilizzare questo metodo ricorsivo per ottenere tutte le proprietà e i relativi valori

  void getAllProperties(JToken children) { foreach (JToken child in children.Children()) { var property = child as JProperty; if (property != null) { Console.WriteLine(property.Name + " " + property.Value);//print all of the values } getAllProperties(child); } } 

Hai preso in considerazione l’utilizzo di JavascriptSerializer?

potresti provare a fare qualcosa del genere:

 JavaScriptSerializer serializer = new JavaScriptSerializer(); var foo = serializer.Deserialize>>(data); foreach(var item in foo) { Console.Writeln(item.Value["ref_id"]); } 

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

La soluzione di Konstantin funzionerà ma se vuoi che una lista di Id faccia la stessa cosa e invece di Console.Writeln () usa il seguente

 List list = new List(); JavaScriptSerializer serializer = new JavaScriptSerializer(); var foo = serializer.Deserialize>>(data); foreach(var item in foo) { list.Add(item.Value["ref_id"]); } 

Ho trovato che la risposta di TrueWill funzionava, ma volevo evitare di forzare e provare a far funzionare un ciclo semplice per motivi di velocità. I miei risultati erano certamente quelli che potremmo definire brutti al meglio. Eccoli nel caso in cui siano utili per chiunque. (Ho lasciato in WriteLine per poter vedere le cose un po ‘più facilmente.)

Si noti che questo non funzionerà per alcuni JSON e non è perfettamente generico. Alcuni controlli Null potrebbero essere fatti meglio, ecc.

  // NOW, DOING IT ALL AS A FOR LOOP... // a, b, c, d - for iterator counters. // j1, j2, j3, j4 - the JTokens to iterator over - each is a child of the previous // p, q, r, s - The properties from j1/2/3/4. JObject o = JObject.Parse(json); JToken j1 = o.First; for (int a = 0; a < o.Children().Count(); a++) { // Outermost loop gives us result, error, id. if (j1 == null) continue; if (a > 0) { j1 = j1.Next; if (j1 == null) continue; } var p = j1 as JProperty; Console.WriteLine("FOR 0 = " + a.ToString() + " --- " + p.Name); // DO STUFF HERE. // FIRST INNER LOOP // Set up a JToken or continue JToken j2 = j1.Children().First() as JToken; if (j1.Children().Count() > 0) { j2 = j1.Children().First() as JToken; } else { continue; } Console.WriteLine("*** STARTING FIRST INNER..."); for (int b = 0; b < j1.Children().Count(); b++) { // returns nothing as second loop above. if (j2 == null) { Console.WriteLine("*** j2 null 1..."); continue; } if (b > 0) { j2 = j2.Next; if (j2 == null) { Console.WriteLine("*** j2 null 2..."); continue; } } var q = j2 as JProperty; // These null checks need to be != or ==, depending on what's needed. if (q != null) { Console.WriteLine("FOR 1 = " + a.ToString() + "," + b.ToString() + " --- " + q.Name); // DO STUFF HERE. // ... } // q !null check // SECOND INNER LOOP // Set up a JToken or continue JToken j3; if (j2.Children().Count() > 0) { j3 = j2.Children().First() as JToken; } else { continue; } Console.WriteLine("****** STARTING SECOND INNER..."); for (int c = 0; c < j2.Children().Count(); c++) { if (j3 == null) continue; if (c > 0) { j3 = j3.Next; if (j3 == null) continue; } var r = j3 as JProperty; if (r == null) { continue; } // r null check Console.WriteLine("FOR 2 = " + a.ToString() + "," + b.ToString() + "," + c.ToString() + " --- " + r.Name); // DO STUFF HERE. // THIRD INNER LOOP // Set up a JToken or continue JToken j4; if (j3.Children().Count() > 0) { j4 = j3.Children().First() as JToken; } else { continue; } Console.WriteLine("********* STARTING THIRD INNER..."); for (int d = 0; d < j3.Children().Count(); d++) { if (j4 == null) continue; if (c > 0) { j4 = j4.Next; if (j4 == null) continue; } var s = j4 as JProperty; if (s == null) { continue; } // s null check Console.WriteLine("FOR 3 = " + a.ToString() + "," + b.ToString() + "," + c.ToString() + "," + d.ToString() + " --- " + s.Name); // DO STUFF HERE. // ... } // for d - j3 } // for c - j2 } // for b - j1 } // for a - original JObject