2012-04-02 12 views
10

Ich muss einige Werte aus einer JSON-Antwort auswählen. Ich benutze json.net, gut mit dem einfacheren Zeug, aber es scheint nicht viel Dokumentation/Tutorials auf etwas vorbei zu geben. Im json Beispiel unten Ich brauche alle Altersstufen wählen:JSON.NET Auswählen von Elementen im Array mit linq

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

}] 

}

Ich habe diese und andere Variationen versucht:

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

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

und diese:

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

Antwort ist ein JObject von einer Webanfrage. bekomme ich nur diese zurück:

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

Die Ergebnisse schließlich in ein Wörterbuch gesetzt werden.

Irgendeine Idee, wie man das macht? Ich weiß, es wird einfach sein, ich habe einfach nicht die richtige Kombination gefunden.

Antwort

20

Wenn Sie die Namen aller Schüler aller Lehrer erhalten möchten, können Sie es zum Beispiel wie folgt tun:

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

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

Oder als eine weitere Option:

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

Wenn Sie möchten, sie als IEnumerable<string>, fügen Sie einfach Value<string>() am Ende der select hinzu. Oder fügen Sie Values<string>() hinzu, wenn Sie mit der ersten Option.

Normalerweise ist es jedoch besser, Typen für Ihr Objektmodell zu erstellen, so dass Sie mit ihnen wie mit normalen Objekten und nicht als einige spezielle JSON-Objekte arbeiten können.

Wenn Sie, dass Sie so etwas wie tun könnte:

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

Hallo svick im mit der ersten Methode - aber ich bin immer wieder heißt: {Newtonsoft.Json.Linq.JEnumerable } in der Variablen names? – gdp

+1

Ja, deshalb habe ich gesagt, dass du 'Values ​​()' hinzufügen musst, wenn du eine Sammlung von 'strings' willst. – svick

+1

Hi svick ich habe die Werte () an das Ende hinzugefügt. es ist jetzt: var names = students.Children() ["name"]. Werte (); – gdp

Verwandte Themen