Десериализация 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Десериализация неизвестных полей NewtonSoft JSON
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Десериализация NewtonSoft JSON неизвестных полей [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Десериализация NewtonSoft JSON неизвестных полей [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Newtonsoft.Json.Schema неправильно проверяет полезную нагрузку JSON по схеме JSON.
    Anonymous » » в форуме C#
    0 Ответы
    67 Просмотры
    Последнее сообщение Anonymous
  • Newtonsoft.Json.Schema неправильно проверяет полезную нагрузку JSON по схеме JSON.
    Anonymous » » в форуме C#
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous

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