Как десериализовать инкапсулированную таблицу объектов в. NET Core из JSON файла? - PullRequest
3 голосов
/ 16 марта 2020

Я хочу получить коллекцию футбольных лиг из внешнего интерфейса API. Ответ от сервера приходит так, как показано ниже:

{
"api": {
    "results": 1496,
    "leagues": [
        {
            "league_id": 1,
            .....

Возвращаемый объект состоит из поля «api», в котором содержатся «результаты» и «лиги». Я хотел бы десериализовать код и сопоставить его с объектами класса League в моем коде.

var jsonString = await ExecuteUrlAsync(filePath, url);

var results = JsonConvert.DeserializeObject<IEnumerable<LeagueEntity>>(jsonString);

jsonString верен, но когда программа попадает во вторую строку, я получаю исключение:

Cannot deserialize the current JSON object (e.g. {\"name\":\"value\"}) into type 'System.Collections.Generic.IEnumerable".

Мне нужно перейти в поле «Лиги» в файле JSON и игнорировать остальную часть ответа. Как этого добиться?

1 Ответ

1 голос
/ 16 марта 2020

Предполагая, что LeagueEntity соответствует api.leagues[*] объектам, вы можете использовать JsonConvert.DeserializeAnonymousType(), чтобы выбрать и десериализовать интересные части JSON:

var leagues = JsonConvert.DeserializeAnonymousType(jsonString, 
                                                   new { api = new { leagues = default(List<LeagueEntity>) } })
    ?.api?.leagues;

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

Демо-скрипта здесь .

(В качестве альтернативы вы можете автоматически сгенерировать полную модель данных для всего JSON, используя один из ответов из Как автоматически сгенерировать файл класса C# из строки JSON .)

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