将json反序列化为c#类

时间:2016-01-01 12:28:37

标签: c# json

我正在尝试使用适用于英雄联盟的RIOT API制作UWP应用程序。

当我访问他们的网站生成JSON时,我会得到类似的结果:

{"gigaxel": {
  "id": 36588106,
   "name": "Gigaxel",
   "profileIconId": 713,
   "revisionDate": 1451577643000,
   "summonerLevel": 30
}}

当我选择此JSON并使用Visual Studio 2015中的特殊粘贴方法将其复制到新类时,我会使用以下属性获取这些类:

public class Rootobject
{
    public Gigaxel gigaxel { get; set; }
}

public class Gigaxel
{
    public int id { get; set; }
    public string name { get; set; }
    public int profileIconId { get; set; }
    public long revisionDate { get; set; }
    public int summonerLevel { get; set; }
}

我创建了一个名为LOLFacade的新类,用于连接到RiotAPI:

 public class LOLFacade
{
    private const string APIKey = "secret :D";

    public async static Task<Rootobject> ConnectToRiot(string user,string regionName)
    {
        var http = new HttpClient();
        string riotURL = String.Format("https://{0}.api.pvp.net/api/lol/{0}/v1.4/summoner/by-name/{1}?api_key={2}",regionName, user, APIKey);
        var response = await http.GetAsync(riotURL);

        var result = await response.Content.ReadAsStringAsync();

        return JsonConvert.DeserializeObject<Rootobject>(result);

    }

}

这是按钮事件处理程序方法:

        Rootobject root = new Rootobject { gigaxel = new Gigaxel() };
        root = await LOLFacade.ConnectToRiot("gigaxel","EUNE");
        string name = root.gigaxel.name;
        int level = root.gigaxel.summonerLevel;

        InfoTextBlock.Text = name + " is level " + level;

我将regionName和用户硬编码用于测试目的。这适用于我的用户名:&#34; gigaxel&#34;。
当我尝试其他用户名时,例如&#34; xenon94&#34;我得到一个例外:

Object reference not set to an instance of an object.

当我将Rootobject中的属性名称从gigaxel更改为xenon94时,如下所示:

public class Rootobject
{
    public Gigaxel xenon94 { get; set; }
}

当我重新编译我的代码时,它适用于用户名xenon94,但它不适用于我的用户名"gigaxel"
我希望它适用于任何给定的用户名。

1 个答案:

答案 0 :(得分:7)

问题是json对象有一个名为 gigaxel的属性。你必须检索内部对象,如下所示:

var json = JsonConvert.DeserializeObject<JObject>(x).First.First;

从那里,您可以通过索引器获取名称和其他内容:

string name = (string)json["name"];
int summonerlevel = (int)json["summonerLevel"]

详细说明,JsonConvert.DeserializeObject(x)将返回一个只有一个对象的新JObject。因此第一次调用。而且,这个对象只有一个名为&#34; gigaxel&#34;的属性。此属性的值是我们需要的信息,例如名称。无论属性的名称是什么,我们都希望检索此信息。因此,我们再次调用 First 来检索此属性的值。