Несколько вариантов десериализации 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 шт):
Если запрос удался, то Success = 1 ... Если же, например, не хватает валюты или какая-то другая причина то вернется Success = 0 ...
Если вы отдаете json в ответ, то с ним вы отдаете и http 200 OK, в обратном случае вы должны отдать ответ 400 Bad Request и никаких Success не нужно.
Решение нашлось! Сначала нужно десериализовать в объект, содержащий
int success;
object responce;
Проверить success и в зависмости от результата, десериализовать в нужны объект!
Вариантов множество:
Например смотреть на код ответа сервера. если 200 = ОК, то сервер вернул внутри объект нужного типа. Если сервер вернул 400, тогда беда, произошла ошибка и нужно десериализовать объект с типом "ошибка".
Сервер меняет свойство Content-Type в зависимости от типа объекта в ответе. если там application-json - то десериализуем, если там там text/plain, то просто выводим текст ошибки куда необходимо.
Можно создать базовый класс и использовать отражение типа в одно из свойств в его наследников. Перед десериализацией находить/читать это свойство и создавать объект нужного типа.
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{}}}