2012-02-18 19 views
16

ho una semplice classe con la seguente proprietà:Serialize/Deserialize un array di byte in JSON.NET

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

ma questo non funziona quando io popolo la proprietà Fotografia con l'immagine e il trasferimento su HTTP. Questa potrebbe sembrare una semplice domanda, ma devo ancora trovare una soluzione dopo aver cercato online per ore, ma come posso serializzare/deserializzare un array di byte in Json.NET? Di quali tag attributo ho bisogno o dovrei farlo in un altro modo? Mille grazie!

+2

Hai trovato un modo per impostare le proprietà dell'oggetto corretto? L'informazione è piuttosto frammentata. Sto cercando una soluzione pulita per lo stesso identico problema. il 'byte []' dovrebbe essere convertito in un array, non in una stringa. –

+0

Penso che JSON.NET abbia problemi con gli array a lunghezza fissa quando si conservano riferimenti e informazioni sul tipo. Quando si conservano i nomi dei tipi nel membro "$ type", viene generato un errore durante il tentativo di deserializzare un array di lunghezza fissa o di sola lettura. Devi usare 'Lista ', oppure usare un JsonConverter per serializzare il membro byte []. Ha davvero bisogno di essere risolto, perché non dovrebbe avere problemi con cose così basilari. – Triynko

risposta

6

È possibile convertire il byte [] in una stringa quindi utilizzare il metodo JsonConvert per ottenere l'oggetto:

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

Diffidare di utilizzare questo metodo per oggetti di grandi dimensioni in quanto si otterranno eccezioni OutOfMemory. I metodi che usano lo Stream (s) sarebbero meglio equipaggiati per gestire gli scenari 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

Mi piace questa risposta, ma potresti voler lanciare un argomento 'Encoding.UTF8' nel secondo argomento del costruttore' StreamReader'. Sono sempre un po 'diffidente nell'usare la codifica predefinita. – dana

+1

Aggiornato lo snippet per avere 'Encoding.UTF8' –

3

Se si utilizza LINQ to JSON, si può fare questo:

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

Il risultato sarà dinamico JObject.

Mentre questo potrebbe non essere esattamente ciò che l'OP stava cercando di fare, potrebbe rivelarsi utile per gli altri che cercano di deserializzare uno byte[] che si imbattono in questa domanda.

Problemi correlati