Универсальный метод парсинга Json

127
01 октября 2019, 08:50

Есть некий апи сервис который отдает Json объекты.

Сервис построен таким образом, что статс 200(OK) может вернуть нужный мне объект, а может вернуть объект ошибки следующего формата { "error": "<error message>" }

public class ApiError
    {
        [JsonProperty("error")]
        public string Message { get; set; }
    }

Мне необходимо проверить какой именно объект вернул сервер, и вернуть true or false , а также свой обственный объект ошибки (он буде отличаться от вышеуказанного).

Вот мой пример кода

private bool IsError(out Error error)
        {
            var apiError = JsonConvert.DeserializeObject<ApiError>(json);
            if (apiError.Message != null )
            {
                error = new Error(apiError.Message);
                return true;
            }
            else
            {
                error = null;
                return false;
            }
        }

Проблема в том, что когда приходит не объект ошибки, приложение крашится с ошибкой сериализации. Я так понимаю нужен какойту универсальный метод

Answer 1

Можно попробовать спарсить в JObject

var ob =JObject.Parse("{ \"message\": \"<simple message>\" }");
var isError = ob.Properties().Any(x=>x.Name == "error");
Console.WriteLine(isError);
ob = JObject.Parse("{ \"error\": \"<error message>\" }");
isError = ob.Properties().Any(x => x.Name == "error");
Console.WriteLine(isError);

Вариант с ContainsKey

var ob =JObject.Parse("{ \"message\": \"<simple message>\" }");
var isError = ob.ContainsKey("error");
Console.WriteLine(isError);
ob = JObject.Parse("{ \"error\": \"<error message>\" }");
isError = ob.ContainsKey("error");
Console.WriteLine(isError);
Answer 2

Единственный вариант выполнить десериализация не нарвавшись на исключение- это выполнить ручную проверку того, что строка подходит по формату целевого объекта.

Например, воспользовавшись строковой функция Contains проверить, есть ли в строке поле еrror или нет.

Однако, я ничего не вижу ничего плохого, что бы получать и обрабатывать исключение.

READ ALSO
Асинхронно загрузить данные

Асинхронно загрузить данные

Есть личный кабинет, при входе отображается имя пользователя и в скобочках его балас(считается в 1с) Как сделать чтобы баланс загружался после...

125
Модульный тест файловых операций

Модульный тест файловых операций

Впервые задумался над написанием модульного теста для проверки копирования и чтения файлов (Unit написал и использовал заглушки Moq), но не знаю...

102
Unity AssetBundle get file in directory

Unity AssetBundle get file in directory

Как мне получить файл который находится в определенной директории в АсеттБандле? директорию "snd2" я добавил в AssetBundle,теперь мне нужно из АссетБандла...

116
работа с cURL через proxy

работа с cURL через proxy

используется код

137