2011-11-20 48 views
5

Tôi có JSON này mà tôi đang cố đọc trên Windows Phone. Tôi đã chơi với DataContractJsonSerializer và Json.NET nhưng đã không có nhiều may mắn, đặc biệt là đọc từng 'nhập':Deserializing JSON trong WP7

{"lastUpdated":"16:12","filterOut":[],"people": 
[{"ID":"x","Name":"x","Age":"x"},{"ID":"x","Name":"x","Age":"x"},{"ID":"x","Name":"x","Age":"x"}], 
"serviceDisruptions": 
    { 
    "infoMessages": 
    ["blah blah text"], 
    "importantMessages": 
    [], 
    "criticalMessages": 
    [] 
    } 
} 

Tất cả tôi quan tâm là các mục trong phần người. Về cơ bản, tôi cần phải đọc và lặp lại thông qua các mục (chứa ID, Tên, các giá trị tuổi) và thêm chúng vào một Bộ sưu tập hoặc lớp. (Tôi đang điền một hộp danh sách sau đó.)

Bất kỳ con trỏ nào được đánh giá cao.

+0

Bạn ví dụ không phải là hợp lệ json, xin vui lòng gửi những điều thực sự :-) – abcde123483

+0

Ok, tôi vừa thay đổi văn bản và hình thành nó thành các dòng riêng biệt. Tại sao bạn nói nó không hợp lệ? –

+0

Đã chỉnh sửa để rõ ràng. –

Trả lời

6

Tôi đã có thể deserialize chuỗi JSON của bạn bằng cách sử dụng mã sau. Điều này đã được thử nghiệm trong một ứng dụng giao diện điều khiển .NET 4, và hy vọng sẽ làm việc trong WP 7 là tốt.

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(PersonCollection)); 

string json = "{\"lastUpdated\":\"16:12\",\"filterOut\":[],\"people\": [{\"ID\":\"a\",\"Name\":\"b\",\"Age\":\"c\"},{\"ID\":\"d\",\"Name\":\"e\",\"Age\":\"f\"},{\"ID\":\"x\",\"Name\":\"y\",\"Age\":\"z\"}], \"serviceDisruptions\": { \"infoMessages\": [\"blah blah text\"], \"importantMessages\": [], \"criticalMessages\": [] } }"; 

using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
{ 
    var people = (PersonCollection)serializer.ReadObject(stream); 

    foreach(var person in people.People) 
    { 
     Console.WriteLine("ID: {0}, Name: {1}, Age: {2}", person.ID, person.Name, person.Age); 
    } 
} 

Sử dụng các lớp dữ liệu sau:

[DataContract] 
public class PersonCollection 
{ 
    [DataMember(Name = "people")] 
    public IEnumerable<Person> People { get; set; } 
} 

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string ID { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Age { get; set; } 
} 
+1

bạn đánh bại tôi với nó, và có JSON của bạn là hợp lệ: http://jsonlint.com/ – invalidusername

+0

Điều này là hoàn hảo cảm ơn bạn, ive sửa đổi nó độc đáo để cư trú bộ sưu tập của tôi. Các bit khó khăn đối với tôi là làm thế nào để liệt kê nó nhưng PersonCollection dường như sắp xếp mà ra độc đáo. –

1

Các giải pháp dưới đây sử dụng Json.NET. Nó deserializes chuỗi JSON đầu tiên thành XML, sau đó sử dụng LINQ to XML để lặp tất cả các nút của mọi người và chuyển đổi chúng thành các thể hiện của lớp Person.

private class Person 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
    public string Age { get; set; } 
} 

// deserializes your JSON and creates a list of Person objects from it 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    // your JSON 
    string json = 
     "{\"lastUpdated\":\"16:12\",\"filterOut\":[],\"people\": " + 
     "[{\"ID\":\"x\",\"Name\":\"x\",\"Age\":\"x\"},{\"ID\":\"x\",\"Name\":\"x\",\"Age\":\"x\"},{\"ID\":\"x\",\"Name\":\"x\",\"Age\":\"x\"}]," + 
     "\"serviceDisruptions\":" + 
     "{" + 
     "\"infoMessages\":" + 
     "[\"blah blah text\"]," + 
     "\"importantMessages\":" + 
     "[]," + 
     "\"criticalMessages\":" + 
     "[]" + 
     "}" + 
     "}"; 

    // deserialize from JSON to XML 
    XDocument doc = JsonConvert.DeserializeXNode(json, "root"); 

    // iterate all people nodes and create Person objects 
    IEnumerable<Person> people = from person in doc.Element("root").Elements("people") 
           select new Person() 
           { 
            ID = person.Element("ID").Value, 
            Name = person.Element("Name").Value, 
            Age = person.Element("Age").Value 
           }; 

    // this is just demonstrating that it worked 
    foreach (Person person in people) 
     Debug.WriteLine(person.Name); 
} 

Đừng quên nhập khẩu:

using Newtonsoft.Json; 
using System.Xml.Linq; 
using System.Diagnostics; 

Và đây là cách JSON deserialized trông giống như là tài liệu XML (đối với những người tò mò trên mạng):

<root> 
    <lastUpdated>16:12</lastUpdated> 
    <people> 
    <ID>x</ID> 
    <Name>x</Name> 
    <Age>x</Age> 
    </people> 
    <people> 
    <ID>x</ID> 
    <Name>x</Name> 
    <Age>x</Age> 
    </people> 
    <people> 
    <ID>x</ID> 
    <Name>x</Name> 
    <Age>x</Age> 
    </people> 
    <serviceDisruptions> 
    <infoMessages>blah blah text</infoMessages> 
    </serviceDisruptions> 
</root> 
+0

Đã không thử điều này, nhưng cảm ơn câu trả lời của bạn. –

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