Однако третья сторона сериализует пустые списки в некоторых своих ответах. таким образом, которого мы не ожидаем. Вот пример.
Когда параметр списка содержит значения
Код: Выделить всё
{
"code": 0,
"msg": "OK",
"info": [
{/* Line Item 1 */},
{/* Line Item 2*/}
]
}
Когда параметр списка пуст
Код: Выделить всё
{
"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