2012-02-18 13 views
16

Mam proste klasy z następujących nieruchomości:Serializować/Cofnięcie tablicą bajtów Json.NET

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

ale to nie działa, kiedy wypełnić właściwość fotografię z obrazem i transferu za pośrednictwem protokołu HTTP. To może brzmieć jak proste pytanie, ale jeszcze nie znalazłem rozwiązania, gdy patrzę online przez wiele godzin, ale w jaki sposób mogę serializować/deserializować tablicę bajtów w Json.NET? Jakie znaczniki atrybutów potrzebuję, czy powinienem robić to w inny sposób? Wielkie dzięki!

+2

Czy znalazłeś sposób na ustawienie poprawnych właściwości obiektu? Informacje są nieco podzielone. Szukam czystego rozwiązania dla dokładnie tego samego problemu. "bajt []" powinien zostać przekonwertowany na tablicę, a nie na łańcuch. –

+0

Myślę, że JSON.NET ma problemy z macierzami o stałej długości, gdy zachowujesz odniesienia i informacje o typie. Zachowując nazwy typów w elemencie "$ type", zgłaszany jest błąd podczas próby deserializacji macierzy o stałej długości lub tylko do odczytu. Zamiast tego należy użyć 'List ' lub użyć JsonConvertera do serializowania elementu byte []. Naprawdę trzeba to naprawić, ponieważ nie powinno mieć problemów z tak podstawowymi rzeczami. – Triynko

Odpowiedz

6

można przekonwertować byte [] na ciąg następnie użyć metody JsonConvert aby uzyskać obiektu:

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

Uważaj na tę metodę dla dużych obiektów, ponieważ otrzymasz wyjątki OutOfMemory. Metody wykorzystujące Stream (y) byłyby lepiej przygotowane do obsługi scenariuszy 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

Podoba mi się ta odpowiedź, ale możesz rzucić argument "Encoding.UTF8" do drugiego argumentu konstruktora 'StreamReader'. Zawsze jestem trochę nieufny w używaniu domyślnego kodowania. – dana

+1

Zaktualizowano fragment kodu, aby mieć kodowanie "Encoding.UTF8" –

3

Jeśli używasz LINQ to JSON, można to zrobić:

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

Wynik będzie dynamiczny JObject.

Chociaż nie jest to dokładnie to, co OP chciał zrobić, może być przydatny dla innych, którzy chcą deserializować byte[], które natrafiają na to pytanie.