2012-04-02 29 views
10

Tôi cần phải chọn một số giá trị từ phản hồi json. Im sử dụng json.net, tốt với những thứ đơn giản hơn, nhưng dường như không có nhiều tài liệu/hướng dẫn về bất cứ điều gì trong quá khứ đó. Trong ví dụ json dưới đây tôi cần phải chọn tất cả các lứa tuổi:JSON.NET Chọn các mục trong mảng với linq

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

}] 

}

Tôi đã cố gắng này và các biến thể khác:

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

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

và điều này:

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

phản hồi là một JObject từ một yêu cầu web. Tôi chỉ nhận lại điều này:

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

Kết quả cuối cùng được đưa vào từ điển.

Bất kỳ ý tưởng nào về cách thực hiện việc này? tôi biết nó sẽ được đơn giản, tôi chỉ havent tìm thấy sự kết hợp đúng.

Trả lời

20

Nếu bạn muốn để có được tên của tất cả sinh viên của tất cả các giáo viên, bạn có thể làm điều đó ví dụ như thế này:

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

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

Hoặc, như một lựa chọn khác:

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

Nếu bạn muốn chúng dưới dạng IEnumerable<string>, chỉ cần thêm Value<string>() vào cuối số select. Hoặc thêm Values<string>(), nếu bạn có tùy chọn đầu tiên.

Nhưng tốt hơn là tạo các kiểu cho mô hình đối tượng của bạn, để bạn có thể làm việc với chúng như với các đối tượng bình thường và không phải là một số đối tượng JSON đặc biệt.

Nếu bạn đã có, bạn có thể làm một cái gì đó như:

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

Hi svick im bằng cách sử dụng phương pháp đầu tiên - nhưng tôi đang được nhận lại là: {Newtonsoft.Json.Linq.JEnumerable } trong biến tên? – gdp

+1

Vâng, đó là lý do tại sao tôi nói bạn cần phải thêm 'Giá trị ()' nếu bạn muốn có một tập hợp 'chuỗi'. – svick

+1

Hi svick tôi đã thêm các giá trị () vào cuối. của nó bây giờ: var names = students.Children() ["name"]. Giá trị (); – gdp

Các vấn đề liên quan