2011-11-20 26 views
5

Tengo este JSON que intento leer en Windows Phone. He estado jugando con DataContractJsonSerializer y Json.NET pero no tenía mucha suerte, especialmente la lectura de cada 'entrada':Deserialización de JSON en 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": 
    [] 
    } 
} 

Todo lo que importa es las entradas de la sección de las personas. Básicamente, necesito leer e iterar a través de las entradas (que contienen la identificación, el nombre, los valores de edad) y agregarlos a una colección o clase. (Estoy poblando un cuadro de lista después.)

Cualquier punteros apreciados.

+0

Usted ejemplo no es válido json, por favor publique la cosa real :-) – abcde123483

+0

Ok, acabo de cambiar el texto y formé el formato en líneas separadas. ¿Por qué dices que no es válido? –

+0

Editado para mayor claridad. –

Respuesta

6

Pude deserializar su cadena JSON utilizando el siguiente código. Esto se probó en una aplicación de consola .NET 4, y con suerte también funcionará en 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); 
    } 
} 

Uso de las siguientes clases de datos:

[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

me ganaste, y sí, tu JSON es válido: http://jsonlint.com/ – invalidusername

+0

Esto es perfecto gracias, lo he modificado muy bien para completar mi colección. Lo difícil para mí fue cómo enumerarlo, pero parece que PersonCollection lo resuelve muy bien. –

1

La solución a continuación utiliza Json.NET. Deserializa la cadena JSON primero en XML, luego usa LINQ to XML para iterar todos los nodos de personas y convertirlos a instancias de la clase 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); 
} 

No se olvide de las importaciones:

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

Y así es como el deserializado JSON se parece como documento XML (para los curiosos por ahí):

<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

No lo he intentado, pero gracias por su respuesta. –

Cuestiones relacionadas