2012-02-18 14 views
16

tengo una clase simple con la siguiente propiedad:Serialize/Deserialize una matriz de bytes en JSON.NET

[JsonObject(MemberSerialization.OptIn)] 
public class Person 
{ 
    ... 
    [JsonProperty(PropertyName = "Photograph"] 
    public byte[] Photograph { get; set; } 
    ... 
} 

pero esto no funciona cuando lo pueblan la propiedad fotografía con una imagen y la transferencia a través de HTTP. Esto puede parecer una pregunta simple, pero aún no he encontrado una solución después de buscar en línea durante horas, pero, ¿cómo serializo/deserializo una matriz de bytes en Json.NET? ¿Qué etiquetas de atributo necesito, o debería hacerlo de otra manera? ¡Muchas gracias!

+2

¿Has encontrado la manera de establecer las propiedades correctas del objeto? La información está algo fragmentada. Estoy buscando una solución limpia para exactamente el mismo problema. el 'byte []' debe convertirse a una matriz, no a una cadena. –

+0

Creo que JSON.NET tiene problemas con las matrices de longitud fija cuando conserva referencias y escribe información. Al conservar nombres de tipos en el miembro "$ type", arroja un error al intentar deserializar una matriz de longitud fija o de solo lectura. En su lugar, tiene que usar 'List ' o usar un JsonConverter para serializar el miembro byte []. Realmente necesita ser reparado, porque no debería tener problemas con cosas tan básicas. – Triynko

Respuesta

6

Puede convertir el byte [] en una cadena a continuación, utilizar el método JsonConvert para obtener el objeto:

var bytesAsString = Encoding.ASCII.GetString(bytes); 
var person = JsonConvert.DeserializeObject<Person>(bytesAsString); 
+0

Tenga cuidado con el uso de este método para objetos grandes, ya que obtendrá excepciones de OutOfMemory. Los métodos que usan Stream (s) estarían mejor equipados para manejar los escenarios de OutOfMemory. – Francis

13
public static T Deserialize<T>(byte[] data) where T : class 
{ 
    using (var stream = new MemoryStream(data)) 
    using (var reader = new StreamReader(stream, Encoding.UTF8)) 
     return JsonSerializer.Create().Deserialize(reader, typeof(T)) as T; 
} 
+4

Me gusta esta respuesta, pero es posible que desee arrojar un argumento 'Encoding.UTF8' en el segundo argumento del constructor' StreamReader'. Siempre estoy un poco receloso sobre el uso de la codificación predeterminada. – dana

+1

Actualicé el fragmento para tener 'Encoding.UTF8' –

3

Si está utilizando LINQ to JSON, usted puede hacer esto:

JObject.Parse(Encoding.UTF8.GetString(data)); 

El resultado será un JObject dinámico.

Si bien es posible que esto no sea exactamente lo que el OP estaba buscando hacer, podría ser útil para otros que buscan deserializar un byte[] que surge con esta pregunta.

Cuestiones relacionadas