Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解析JSON文本中的特定部分,以生成传奇联盟中的英雄列表_C#_Json_Parsing_Console Application - Fatal编程技术网

C# 如何解析JSON文本中的特定部分,以生成传奇联盟中的英雄列表

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 ";

我试图从一个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 ";
            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();
}