2011-11-20 18 views
12

Estoy seguro de que esta pregunta se ha formulado una y otra vez, pero por alguna razón, todavía no logro hacerlo funcionar.Deserializar una matriz JSON simple con DataContractJsonSerializer

Quiero deserializar un objeto JSON que contiene un único miembro; una matriz de cadenas:

{"results" : ["a", "b"]} 

Esta es la clase que estoy tratando de deserializar en:

public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

Y este es el método Deserialize:

private static T Deserialize<T>(string json) 
{ 
    var instance = Activator.CreateInstance<T>(); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var serializer = new DataContractJsonSerializer(instance.GetType()); 
     return (T)serializer.ReadObject(ms); 
    } 
} 

una llamada como Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}") es devolviendo una instancia inicializada de Whatever pero la matriz Results se queda null.

¿Hay algún problema con la estructura de Whatever?

+11

No es necesario instancia de 'var = Activator.CreateInstance ();' 'utilizar typeof (T)' –

Respuesta

12

Ah, después de publicar este me di cuenta que me estaba perdiendo la decoración DataContract atributo en Whatever:

[DataContract] 
public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

ahora funciona bien.

+6

Gracias. También es crucial mapear los nombres de los miembros de los datos con mayúsculas y minúsculas. Has hecho eso, sin embargo quiero enfatizar esto en caso de que alguien intente usar DataContract y DataMember, pero se olvida del atributo de Nombre (como lo he hecho la primera vez). – cudahead

+1

¡Eres increíble! –

8

lo sé, la publicación está prohibida; pero: también es posible devolver directamente una lista de objetos de clase, si tiene una jsonarray-cadena de información para enlazar a una clase de datos; es decir .:

List<SomeDataClass> filesToMove = new List<SomeDataClass>(); 

public T deserializeJSON<T>(string json) 
{ 
    var instance = typeof(T); 
    var lst = new List<SomeDataClass>(); 

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var deserializer = new DataContractJsonSerializer(instance); 
     return (T)deserializer.ReadObject(ms); 
    } 
} 

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]"; 
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString); 
Console.WriteLine(filesToMove[1].ID); // returns 16 

con DATACLASS SomeDataClass.cs:

[DataContract] 
class SomeDataClass 
{ 
    [DataMember] 
    public int ID { get; set; }   
} 
+0

¿Qué pasa con la Lista? Tu ejemplo no funciona como lo has publicado. – Sebastian

Cuestiones relacionadas