Deserializar JSON, который может быть одиноким объект в Список <T>

У меня есть проблема, которую я не умею решать.

У меня есть объект 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, не является моим, не зависит от меня и следовательно не может быть измененным.

2
задан 05.11.2019, 19:00
2 ответа

Так как ты не можешь изменять 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 мало ортодоксальных , чтобы решать проблему. Иногда, (и не всегда) цель оправдывает средства .

3
ответ дан 01.12.2019, 12:40
  • 1
    Поскольку я понимаю, не является рекомендуемым использовать исключения как условия, а следовательно я выбрал вторую opció n и пока функционируй хорошо. – Fran 06.11.2019, 09:12

Поскольку я сказал тебе в моем комментарии, ты можешь реализовывать следующее:

Добавлять 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);
   }
0
ответ дан 01.12.2019, 12:40