Как мне разобрать определенный раздел из текста JSON, чтобы составить список героев из League of Legends - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь получить все имена героев из Лиги Легенд из URL JSON: http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json, и я пытаюсь получить имя этого героя после "имени": из URL JSON.

Как мне узнать имена всех героев?

Я пытался с индексом и подстрокой, но я чувствую, что это жесткое кодирование

$public static async void GetHtml()
        {
            var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json ";
            var httpClient = new HttpClient();
            var html = await httpClient.GetStringAsync(url);`

            var htmlDocument = new HtmlDocument(); 

            htmlDocument.LoadHtml(html);

            var jsonData =  JObject.Parse(html);

            var index = jsonData.ToString().IndexOf("name", StringComparison.Ordinal);

            var champName= jsonData.ToString().Substring(index, 20);
                Console.WriteLine(champName);
        }

У меня только одно имя, и моя цель - собрать все имена героев в списке. Кстати, я использую JSON.Net

1 Ответ

0 голосов
/ 10 июня 2019

Во-первых, переменная html, которую вы пытаетесь проанализировать, является просто строкой JSON.Вам вообще не нужно HtmlDocument.

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

В JSON.net наилучшей подходящей структурой является Dictionary<,>.В результате ключами будут имена членов, а значениями - любой тип записи, который мы выберем.В этом случае нас интересуют только имена членов, поэтому мы можем использовать пустой тип записи.

В этом случае минимальное JSON-представление интересующих нас частей выглядит примерно так:

{
    {
        "Aatrox": { "name":"Aatrox" },
        "Ahri": { "name":"Ahri" },
        "AurelionSol": { "name":"Aurelion Sol" }
    }
}

Ниже приведена минимальная структура класса для разбора исходного файла, которая будет захватывать только ту информацию, которая нам интересна:

class ChampionsRoot
{
    public Dictionary<string, ChampionInfo> data;
}

class ChampionInfo
{
    public string name;
}

Теперь нам просто нужен некоторый код для извлечения этих имен из данных:

static void Main()
{
    var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json";
    var httpClient = new HttpClient();
    var source = httpClient.GetStringAsync(url).Result;

    var root = JsonConvert.DeserializeObject<ChampionsRoot>(source);
    var names = root.data.Select(kv => kv.Value.name).ToArray();
}

А теперь names - это массив всех значений name.


Или, если вы хотите использовать регулярное выражение:

void Main()
{
    var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json";
    var httpClient = new HttpClient();
    var source = httpClient.GetStringAsync(url).Result;

    // "name":"(value)"
    var regex = new Regex("\"name\":\"([^\"]+)\"");
    var matches = regex.Matches(source);
    var names = matches.OfType<Match>().Select(_ => _.Groups[1].Value).ToArray();
}

В данных нет других полей name, поэтому он возвращает те же результаты, что и версия JSON.net, только без зависимости.

...