C# 如何解析JSON文本中的特定部分,以生成传奇联盟中的英雄列表
我试图从一个JSON url中获取传奇联盟中所有英雄的名字:我试图从JSON url中,在“name”之后获取英雄的名字 我怎么知道所有英雄的名字 我尝试了索引和子字符串,但我觉得这是硬编码C# 如何解析JSON文本中的特定部分,以生成传奇联盟中的英雄列表,c#,json,parsing,console-application,C#,Json,Parsing,Console Application,我试图从一个JSON url中获取传奇联盟中所有英雄的名字:我试图从JSON url中,在“name”之后获取英雄的名字 我怎么知道所有英雄的名字 我尝试了索引和子字符串,但我觉得这是硬编码 $public static async void GetHtml() { var url = "http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_US/champion.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,您试图解析的
html
变量只是一个JSON字符串。您根本不需要HtmlDocument
一般来说,您需要创建一组类来反序列化数据。因为您只需要部分信息,所以只需要一组最小的类来描述结构
在JSON.net中,最佳匹配结构是字典
。结果的键是成员名,值是我们选择的任何记录类型。在本例中,我们只关心成员名称,因此可以使用空记录类型
在本例中,我们感兴趣的部分的最小JSON表示形式如下所示:
{
{
"Aatrox": { "name":"Aatrox" },
"Ahri": { "name":"Ahri" },
"AurelionSol": { "name":"Aurelion Sol" }
}
}
下面是一个用于将原始文件解析为的最小类结构,它只捕获我们关心的信息:
class ChampionsRoot
{
public Dictionary<string, ChampionInfo> data;
}
class ChampionInfo
{
public string name;
}
数据中没有其他
name
字段,因此返回的结果与JSON.net版本相同,只是没有依赖项。还有一个问题,如果我想获得例如“Aatrox.png”,如何从图像转换为完整?再次感谢:)@MazzEbra您需要另一个类来捕获图像
成员。类似于struct ChampionImage{public string full;}
和添加public ChampionImage代码>至ChampionInfo
课程。再次感谢同学。你真是太棒了@MazzEbra我已经准备了一个快速的LINQPad脚本,其中包含了类的最小版本和完整版本,让你有一个想法。
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();
}
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();
}