2011-11-20 15 views
5

Ho questo JSON che sto cercando di leggere su Windows Phone. Ho giocato con DataContractJsonSerializer e Json.NET ma non avevo molta fortuna, soprattutto la lettura di ogni 'ingresso':Deserializzazione JSON in 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": 
    [] 
    } 
} 

Tutto quello che interessa è il voci nella sezione persone. Fondamentalmente ho bisogno di leggere e scorrere le voci (contenente l'ID, il nome, i valori di età) e aggiungerle a una raccolta o a una classe. (Sto compilando una listbox in seguito.)

Qualsiasi suggerimento apprezzato.

+0

Si esempio non è valido JSON, per favore pubblica la cosa vera :-) – abcde123483

+0

Ok, ho appena cambiato il testo e l'ho formattato in righe separate. Perché dici che non è valido? –

+0

Modificato per chiarezza. –

risposta

6

Sono stato in grado di deserializzare la stringa JSON utilizzando il seguente codice. Questo è stato testato in un'applicazione di console .NET 4 e, si spera, funzionerà anche in 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); 
    } 
} 

Utilizzando le seguenti classi di dati:

[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

mi hai battuto, e sì il tuo JSON è valido: http://jsonlint.com/ – invalidusername

+0

Questo è perfetto grazie, tu l'hai modificato piacevolmente per popolare la mia collezione. La cosa difficile per me era come enumerarlo, ma il PersonCollection sembra risolverlo bene. –

1

La soluzione qui di seguito utilizza Json.NET. Deserializza prima la stringa JSON in XML, quindi usa LINQ in XML per iterare tutti i nodi delle persone e convertirli in istanze della classe 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); 
} 

Da non dimenticare le importazioni:

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

Ed è così che il deserializzato JSON sembra come documento XML (per i curiosi là fuori):

<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

Non ho provato questo, ma grazie per la tua risposta. –

Problemi correlati