Десериализация C# Newtonsoft JSON: значение пустого списка, представленное как «{}» вместо «[]», вызывает исключениеC#

Место общения программистов C#
Ответить
Anonymous
 Десериализация C# Newtonsoft JSON: значение пустого списка, представленное как «{}» вместо «[]», вызывает исключение

Сообщение Anonymous »

В настоящее время мы поддерживаем интеграцию API со сторонней организацией, которая передает ответы через JSON. Мы используем C# .NET и Newtonsoft JSON (версия 13.0.1) для сериализации запросов и десериализации ответов.
Однако третья сторона сериализует пустые списки в некоторых своих ответах. таким образом, которого мы не ожидаем. Вот пример.
Когда параметр списка содержит значения

Код: Выделить всё

{
"code": 0,
"msg": "OK",
"info": [
{/* Line Item 1 */},
{/* Line Item 2*/}
]
}
(Позиция 1 и 2 заменена допустимым JSON для другого типа объекта)
Когда параметр списка пуст

Код: Выделить всё

{
"code": 0,
"msg": "OK",
"info": {}
}
Насколько я могу судить, когда параметр списка/коллекции должен быть нулевым или пустым, он либо должен быть «[]», либо просто отсутствует. И то, и другое было бы хорошо с точки зрения десериализации. Вместо этого мы получаем обратное исключение.

Newtonsoft.Json.JsonSerializationException: невозможно десериализовать текущий объект JSON (например, {"name":"value"} ) в тип «System.Collections.Generic.IList`1[GenericResponseLineItem]», поскольку для правильной десериализации этого типа требуется массив JSON (например, [1,2,3]).
Чтобы исправить эту ошибку, измените JSON. в массив JSON (например, [1,2,3]) или измените десериализованный тип так, чтобы это был обычный тип .NET (например, не примитивный тип, такой как целое число, не тип коллекции, такой как массив или список), который можно десериализован из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализовать из объекта JSON.

Вот как я сейчас определяю класс в C# р>

Код: Выделить всё

[Serializable]
public class GenericNamedResponseObject
{
[JsonProperty("code")]
public int? Code { get; set; }

[JsonProperty("msg")]
public string ErrorMessage { get; set; }

private IList _info;

[JsonProperty("info")]
public IList Info
{
get => _info ?? (_info = new List());
set => _info = value;
}

}
Текущий обходной путь
На данный момент у меня есть обходной путь, который выполняет попытку десериализации моего GenericNamedResponseObject , затем пытается десериализовать написанный мной объект GenericNamedResponseAlternateFormatting, в котором полностью отсутствует параметр Info.
Это работает, но это уродливый хак, и мы видим еще больше ответов от сторонних поставщиков, имеющих аналогичный формат.
Есть ли в Newtonsoft JSON свойство, которое принимало бы как «[]», так и «{}» как пустой список представления во время десериализации? Сторонняя сторона совершенно не соответствует этому, поскольку некоторые типы ответов десериализуются без ошибок, а некоторые нет.
Или, если мне нужно написать собственный десериализатор, как бы это сделать? Я справлюсь с этим правильно?

Подробнее здесь: https://stackoverflow.com/questions/787 ... nted-as-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»