如何解析 JSON 文本中的特定部分以制作英雄联盟英雄列表

How do I parse a specific section from a JSON text to make a list of heroes from League of Legends

我正在尝试从 JSON url: http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.json 中获取英雄联盟中所有英雄的名字,并且我正在尝试找出名字"name"之后的那个英雄:来自JSONurl。

如何获取所有英雄的名字?

我尝试使用索引和子字符串,但我觉得这是硬编码

$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

首先,您要解析的 html 变量只是一个 JSON 字符串。你根本不需要 HtmlDocument

一般来说,您需要创建一组 classes 来反序列化数据。由于您只需要部分信息,因此您只需要最少的一组 classes 来描述结构。

在JSON.net中,最匹配的结构是Dictionary<,>。结果将使键成为成员名称,值成为我们选择的任何记录类型。在这种情况下,我们只关心成员名称,因此我们可以使用空记录类型。

在这种情况下,我们感兴趣的部分的最小 JSON 表示如下所示:

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

这里是一个最小的 class 结构,用于将原始文件解析成只会捕获我们关心的信息:

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 字段,所以这个 returns 与没有依赖项的 JSON.net 版本的结果相同。