Несколько вариантов десериализации JSON. Как правильно оформить?

Есть некоторое API, которое я хочу реализовать на C#. Распишу мой вопрос на примере одного из запросов, который создает ордер на продажу валюты.

Запрос возвращает ответ в виде Json, и передает всегда 2 параметра. Если запрос удался, то Success = 1 и Тело с параметрами открытого ордера Словарь(Key-value).

Если же, например, не хватает валюты или какая-то другая причина то вернется Success = 0 и строка (String) с пояснением ошибки.

Соответственно, есть два класса POJO: Error и Complete (Для понятности) Других вариантов ответа быть не может в моём случае, но бывает всякое, поэтому задаю этот вопрос. А вопрос в следующем:

Как правильно десериализовать полученный ответ?

Задаюсь этим вопросом, так как заранее я не могу знать какому объекту присваивать результат от запроса.

В голову приходит через try/catch попробовать десериализовать сначала с Complete, в случае ошибки десериализовывать в Error. Но получается откровенный колхоз! А если вариантов ответа будет больше?

Подскажите, пожалуйста, как это делается по человечески?

UPD:

Решение нашлось! Сначала нужно десериализовать в объект, содержащий

int success;
object responce;

Проверить success и в зависмости от результата, десериализовать в нужны объект!

UPD2:

Всё гениальное - просто! Нужно расширить класс-модель полем error и смело десериализовать. В зависимости от результата заполнятся нужные поля.


Ответы (3 шт):

Автор решения: Bulson

Если запрос удался, то Success = 1 ... Если же, например, не хватает валюты или какая-то другая причина то вернется Success = 0 ...

Если вы отдаете json в ответ, то с ним вы отдаете и http 200 OK, в обратном случае вы должны отдать ответ 400 Bad Request и никаких Success не нужно.

→ Ссылка
Автор решения: Таксист Молодой

Решение нашлось! Сначала нужно десериализовать в объект, содержащий

int success;
object responce;

Проверить success и в зависмости от результата, десериализовать в нужны объект!

→ Ссылка
Автор решения: Yakov

Вариантов множество:

  1. Например смотреть на код ответа сервера. если 200 = ОК, то сервер вернул внутри объект нужного типа. Если сервер вернул 400, тогда беда, произошла ошибка и нужно десериализовать объект с типом "ошибка".

  2. Сервер меняет свойство Content-Type в зависимости от типа объекта в ответе. если там application-json - то десериализуем, если там там text/plain, то просто выводим текст ошибки куда необходимо.

  3. Можно создать базовый класс и использовать отражение типа в одно из свойств в его наследников. Перед десериализацией находить/читать это свойство и создавать объект нужного типа.

     public abstract class PluginAdapter : IPluginAdapter
     {
         [DisplayName("Версия библиотеки"), Description("Отладочное свойство"), Category("Плагин")]
         public string Version => "1";
         [DisplayName("Тип данных"), Description("Отладочное свойство"), Category("Плагин")]
    
         public string typeFullName { get => this.GetType().FullName; set{} }
    
         [DisplayName("Сборка"), Description("Путь к файлу сборки"), Category("Плагин")]
         public string assemblyPath { get => GetType().Assembly.Location; set{}}}
    
→ Ссылка