Десериализовать объект JSON в класс со «динамическим» свойством - PullRequest
0 голосов
/ 14 ноября 2018

Я получаю сообщения JSON, которые соответствуют следующему классу:

public class Response
{
    public int Code { get; }
    public string Message { get; }
    public string Result { get; }
}

Но значение свойства Result зависит от того, что мы получаем в Code, и не имеет фиксированной структуры.

Например, если Code = 1, Result вернет список объектов типа X, а если Code = 2, Result вернет список объектов типа Y.

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

var responseObj = JsonConvert.DeserializeObject<Response>(response);
if (responseObj.Code == 1)
{
    return responseObj.Result;
}

Приведенный выше оператор возврата вызывает следующее исключение:

Обнаружен неожиданный символпри разборе значения: [.Путь 'Результат'

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

1 Ответ

0 голосов
/ 16 ноября 2018

Как я могу определить свой класс так, чтобы он получил весь текст Результата, и я мог принять решение о его десериализации позже?

Если это то, что вызатем сделайте ваше свойство Result JToken вместо string, как показано ниже.Вам также нужно добавить сеттеры во все свойства, показанные в вашем классе Response, чтобы десериализация работала правильно: вы не можете десериализовать в свойства только для чтения.

public class Response
{
    public int Code { get; set; }
    public string Message { get; set; }
    public JToken Result { get; set; }
}

Как только вы знаете,в какой тип Result следует преобразовать, вы можете использовать метод ToObject() для этого.Например:

Response responseObj = JsonConvert.DeserializeObject<Response>(response);

if (responseObj.Code == 1)
{
    var listOfX = responseObj.Result.ToObject<List<X>>();
    ...
}

Скрипка: https://dotnetfiddle.net/pz5m63

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...