У меня есть проблема, которую я не умею решать.
У меня есть объект Movimientos
, и вслед за призывом к ApiRest, я получаю список их, которые deserializo следующей формы.
result = JsonConvert.DeserializeObject<List<Movimientos>>(contenido);
До сих пор совершенный, проблема, - когда мой призыв к Api возвращает только один Movimiento
, который та же линия deserialización отпускает:
{ "Cannot deserialize the current JSON object (e.g. {\\"ямс \": \"оцените \" }) into type 'System. Collections. Generic. List '1 [Движения]' because the type requires в JSON array (e.g. [1,2,3]) to deserialize correctly.\r\nTo fix this ошибка either change the JSON to в JSON array (e.g. [1,2,3]) or change the deserialized type so that it is в нормальный.NET type (e.g. not в primitive type like integer, not в collection type like an array or List) that хан be deserialized from в JSON object. JsonObjectAttribute хан also be added to the type to я вынудил it to deserialize from JSON object." }
Как я могу делать это для того, чтобы оно функционировало так с json, который содержал бы список как для единственного элемента?
Я издаю с большим количеством упрощенных данных: json примера, который возвращает api,
string contenido = "{ \"NumeroOrden\":null,\"Operacion\":null}";
И класс Движения
public class Movimientos
{
public string NumeroOrden { get; set; }
public string Operacion { get; set; }
}
Я издаю: Json, который я получаю, должен быть неизменным. То, что возвращает api, не является моим, не зависит от меня и следовательно не может быть измененным.
Так как ты не можешь изменять API REST (segГєn ты показываешь в комментариях), ты должен тогда контролировать cГіdigo , чтобы подтверждать, то, что возвращает тебе Веб API, является ли Array или простым Объектом.
ты это Можешь делать из большие формы , тебя показал два:
1 - Посредством исключений (Try/Catch)
List<Movimientos> result;
var contenido = "{ \"NumeroOrden\":null,\"Operacion\":null}";
try
{
result = JsonConvert.DeserializeObject<List<Movimientos>>(contenido);
}
catch (Exception)
{
// Si lanza la excepción es que es un solo elemento.
var singleResult = JsonConvert.DeserializeObject<Movimientos>(contenido);
result = new List<Movimientos>();
result.Add(singleResult);
}
2 - Подтверждая, Array ли (Он начинается из-за' это [' и заканчивает из-за']')
List<Movimientos> result;
var contenido = "[{ \"NumeroOrden\":null,\"Operacion\":null}]";
if (contenido.StartsWith("[") && contenido.EndsWith("]"))
{
result = JsonConvert.DeserializeObject<List<Movimientos>>(contenido);
}
else
{
var singleResult = JsonConvert.DeserializeObject<Movimientos>(contenido);
result = new List<Movimientos>();
result.Add(singleResult);
}
Конечно, это две формы orientativas из этого делать (улучшаемые), сейчас все зависит тебя aplicaciГіn и твои уровень programaciГіn .
UPDATE:
SegГєn твой комментарий:
, поскольку я понимаю, не является рекомендуемым использовать исключения как условия, а следовательно я выбрал вторую opciГіn и пока функционируй хорошо.
Действительно, не является рекомендуемым использовать Исключения genГ©ricas для условных разгрузок контроля. Но существуют случаи (как твой), в которых плохая одна programaciГіn , которые не возможно исправлять (как Веб API, который ты тратишь) требует mГ©todos мало ортодоксальных , чтобы решать проблему. Иногда, (и не всегда) цель оправдывает средства .
Поскольку я сказал тебе в моем комментарии, ты можешь реализовывать следующее:
Добавлять try catch
внутри try
выполняешь ты cГіdigo, который он санкционирует, если ты приходишь несколько элементов в Объекте, он ничего не перемещает возвращается нормально, но если он приходит только, элемент ты идет производить ошибку с этим стоившие внутри catch
ты будешь помещать cГіdigo, с одиноким которым deserializas объект.
var contenido = "{\"NumeroOrden\":null,\"Operacion\":null}";
try
{
result = JsonConvert.DeserializeObject<List<Movimientos>>(contenido);
}
catch (Exception)
{
result = JsonConvert.DeserializeObject<Movimientos>(contenido);
}