如何解析 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 版本的结果相同。
我正在尝试从 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 版本的结果相同。