У меня есть ситуация, когда ответ от API может содержать либо массив, либо отдельный элемент. Однако я борюсь с десериализацией ответов из-за ответа массива, содержащего другой вложенный объект. Вот различные ответы, которые могут быть возвращены (образец).
Это формат ответа, когда возвращается список элементов
{
"data": {
"items": [
{
"id": 1
},
{
"id": 2
}
]
}
}
Это ответ, который отправляется, когдавозвращается один элемент
{
"data": {
"id": 1
}
}
Моя первоначальная попытка стандартизировать ответ включала создание настраиваемого атрибута преобразователя, но проблема в том, что вы не можете передать в него универсальный параметр. Код для ReadJson приведен ниже:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if(token["items"]?.Type == JTokenType.Array)
{
return token["items"].ToObject<T>();
}
return new List<T>() { token.ToObject<T>() };
}
Вот класс, представляющий ответ, но я получаю сообщение об ошибке, что обобщенные значения не могут быть переданы в атрибуты. После прочтения, кажется, что это сделано специально.
public class Response<T>
{
[JsonProperty("version")]
public string Version { get; set; }
[JsonConverter(SingleOrArrayConverter<T>)]
public T Data { get; set; }
[JsonProperty("_links")]
public Links Links { get; set; }
}
У кого-нибудь есть другие мысли / решения этой проблемы?