Сериализация байтового массива в JSON.NET - PullRequest
7 голосов
/ 15 апреля 2010

Учитывая этот простой класс:

class HasBytes
{
    public byte[] Bytes { get; set; }
}

Я могу поместить его через JSON.NET так, чтобы байтовый массив кодировался в base-64:

var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
var json = JsonConvert.SerializeObject(bytes);

Тогда я могу снова прочитать его немного сложным образом:

TextReader textReader = new StringReader(json);
JsonReader jsonReader = new JsonTextReader(textReader);
var result = (HasBytes)JsonSerializer.Create(null)
                 .Deserialize(jsonReader, typeof(HasBytes));

Все хорошо. Но если я сначала включу содержимое jsonReader в JToken:

var jToken = JToken.ReadFrom(jsonReader);

А затем превратить это обратно в JsonReader, обернув его в JTokenReader:

jsonReader = new JTokenReader(jToken);

Затем десериализация создает исключение: «Ожидаемые байты, но есть строка».

Разве новый JsonReader не должен быть логически эквивалентным оригинальному? Почему «raw» JsonTextReader имеет возможность обрабатывать строку как массив из 64 байтов, а версия JTokenReader - нет?

1 Ответ

6 голосов
/ 15 апреля 2010

Насколько я вижу, это ошибка в JTokenReader, поэтому я сообщил об этом здесь .

Обновление: исправлено в выпуске 7 JSON.NET 3.5.

...