2012-02-18 4 views
16

У меня есть простой класс со следующим свойством:сериализации/десериализации байтовый массив в Json.NET

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

, но это не работает, когда я заполнить свойство фотографии с изображением и передачи по протоколу HTTP. Это может показаться простым вопросом, но я еще не нашел решение после поиска в Интернете часами, но как мне сериализовать/десериализовать массив байтов в Json.NET? Какие теги атрибутов мне нужны или я должен делать это по-другому? Большое спасибо!

+2

Вы нашли способ установить правильные свойства объекта? Информация несколько фрагментирована. Я ищу чистое решение для той же проблемы. 'byte []' должен быть преобразован в массив, а не в строку. –

+0

Я думаю, что JSON.NET имеет проблемы с массивами с фиксированной длиной, когда вы сохраняете ссылки и информацию о типе. При сохранении имен типов в элементе «$ type» он выдает ошибку при попытке десериализации массива с фиксированной длиной или только для чтения. Вы должны использовать 'List ' вместо этого или использовать JsonConverter для сериализации элемента byte []. Это действительно нужно исправлять, потому что у него не должно быть проблем с такими основными вещами. – Triynko

ответ

6

Вы можете преобразовать байт [] в строку затем использовать метод JsonConvert для получения объекта:

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

Будьте осторожны с использованием этого метода для больших объектов, так как вы получите OutOfMemory Exceptions. Методы, которые используют Stream (s), были бы лучше оснащены для обработки сценариев 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

Мне нравится этот ответ, но вы можете захотеть включить аргумент 'Encoding.UTF8' во второй аргумент конструктора' StreamReader'. Я всегда немного разбираюсь в использовании кодировки по умолчанию. – dana

+1

Обновлен фрагмент для 'Encoding.UTF8' –

3

Если вы используете LINQ to JSON, вы можете сделать это:

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

Результат будет динамическим JObject.

Хотя это может быть и не совсем то, что OP должен был делать, это может пригодиться другим, желающим десериализовать byte[], которые сталкиваются с этим вопросом.

Смежные вопросы