2011-11-20 11 views
5

Mam ten JSON, który próbuję odczytać w systemie Windows Phone. Grałem z DataContractJsonSerializer i Json.NET ale nie miał dużo szczęścia, zwłaszcza czytając każdy wpis „”:Deserializowanie JSON w pakiecie 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": 
    [] 
    } 
} 

Wszystko zależy mi na to wpisy w dziale ludzie. Zasadniczo muszę przeczytać i powtórzyć wpisy (zawierające identyfikator, nazwę, wartości wieku) i dodać je do kolekcji lub klasy. (Potem zapełniam listę).

Wszelkie wskazówki są mile widziane.

+0

Ty przykładowych nie jest prawidłowy json, proszę zamieścić prawdziwą wiadomość :-) – abcde123483

+0

Ok, właśnie zmieniłem tekst i sformatowałem go w osobne linie. Dlaczego mówisz, że to nie jest ważne? –

+0

Edytowane w celu zachowania przejrzystości. –

Odpowiedz

6

Byłem w stanie deserializować twój ciąg JSON za pomocą następującego kodu. Zostało to przetestowane w aplikacji konsoli .NET 4 i mam nadzieję, że będzie działać również w WP 7.

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

Korzystanie z następujących klas danych:

[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

pokonałeś mnie i tak, twój JSON jest ważny: http://jsonlint.com/ – invalidusername

+0

To jest idealne dzięki tobie, ive go ładnie zapełnił moją kolekcję. Najtrudniejszy był dla mnie sposób jego wyliczenia, ale wydaje mi się, że Kolekcja Osobowa dobrze to porządkuje. –

1

Rozwiązanie wykorzystuje Json.NET poniżej. Najpierw deserializuje ciąg JSON do formatu XML, a następnie używa LINQ do XML do iterowania wszystkich węzłów i konwersji ich do instancji klasy 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); 
} 

Nie zapomnij Import:

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

i to, w jaki sposób innej niż serializowana JSON wygląda jak dokument XML (dla ciekawskich ludzi tam):

<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

Nie próbowałem tego, ale dziękuję za odpowiedź. –

Powiązane problemy