2012-04-02 54 views
10

我需要從json響應中選擇一些值。我使用json.net,很簡單的東西,但似乎沒有太多的文檔/教程過去的任何事情。在JSON下面的例子,我需要選擇所有的年齡段:JSON.NET使用linq選擇數組中的項目

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

}] 

}

我已經試過這和其他變化:

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

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

這:

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

響應是來自webrequest的JObject。 我剛回來的:

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

結果最終被付諸一本字典。

任何想法如何做到這一點?我知道這很簡單,我只是沒有找到合適的組合。

回答

20

如果你想獲得所有教師的所有學生的名字,你可以做到這一點的例子是這樣的:

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

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

或者,作爲另一種選擇:

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

如果你想他們爲IEnumerable<string>,只需在select的末尾添加Value<string>()即可。或者加上Values<string>(),如果你有第一個選項。

但是,爲對象模型創建類型通常會更好,因此您可以像使用普通對象一樣使用它們,而不是像某些特殊的JSON對象一樣使用它們。

如果你有,你可以這樣做:使用第一種方法

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

喜svick IM - 但我得到的回覆是:{Newtonsoft.Json.Linq.JEnumerable }的名稱變量? – gdp 2012-04-03 10:51:53

+1

是的,這就是爲什麼我說你需要添加'Values ()'如果你想要一個字符串的集合。 – svick 2012-04-03 11:09:01

+1

嗨svick我添加了值()到最後。其現在: var names = students.Children()[「name」]。值(); – gdp 2012-04-03 11:53:25