2011-11-20 21 views
5

Windows Phone'da okumaya çalıştığım bu JSON'u kullanıyorum. Özellikle her 'girişini' okuma DataContractJsonSerializer Json.NET ve oynarken ama pek şans Kandırıldık:WP7'de JSON Desistifikasyonu

{"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": 
    [] 
    } 
} 

Tek önemsediğim insanlar bölümünde girdidir. Temel olarak girişleri (ID, İsim, Yaş değerleri içeren) okuyup yinelemeli ve bunları bir Koleksiyona veya sınıfa eklemeliyim. (Sonra bir liste kutusu dolduruyorum.)

Herhangi bir işaretçi beğeni topladı.

+0

Sen örneği geçerli json değil, lütfen gerçek şeyi gönderin :-) – abcde123483

+0

Tamam, sadece metni değiştirdim ve ayrı çizgiler halinde biçimlendirdim. Neden geçerli olmadığını söylüyorsun? –

+0

Açıklık için düzenlenmiştir. –

cevap

6

JSON dizginizi aşağıdaki kodu kullanarak seri hale getirebildim. Bu bir .NET 4 konsol uygulamasında test edildi ve umarım WP 7'de de çalışacaktır.

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); 
    } 
} 

aşağıdaki veri sınıflarını kullanma:

[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

beni ona dövdün ve evet JSON geçerli: http://jsonlint.com/ – invalidusername

+0

Bu mükemmel, teşekkürler, koleksiyonumu doldurmak için güzelce değiştirdim. Benim için zor olan bit, nasıl numaralandırılacağıydı, ancak PersonCollection bunu güzel bir şekilde sıralıyor gibi görünüyor. –

1

çözeltisi aşağıdaki Json.NET kullanır. Önce JSON dizgisini XML'e gönderir, sonra tüm insanlar düğümlerini yinelemek ve bunları Person sınıfının örneklerine dönüştürmek için LINQ to XML'i kullanır.

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); 
} 

ithalatı unutmayın:

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

Ve bu serisi kaldırılan JSON (orada meraklı insanlar için), XML belgesi olarak nasıl göründüğünü geçerli:

<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

Bunu denemediniz, ama cevabınız için teşekkürler. –