我正在尝试使用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 TaskConnectToRiot(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 (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和用户以进行测试.这适用于我的用户名:"gigaxel".
当我尝试另一个用户名,例如"xenon94"时,我得到一个例外:
Object reference not set to an instance of an object.
当我将Rootobject中的属性名称从gigaxel更改为xenon94时,如下所示:
public class Rootobject { public Gigaxel xenon94 { get; set; } }
当我重新编译我的代码时,它适用于用户名,xenon94
但它不适用于我的用户名"gigaxel"
.
我希望它适用于任何给定的用户名.
问题是json对象有一个名为 gigaxel 的属性.你必须检索内部对象,如下所示:
var json = JsonConvert.DeserializeObject(x).First.First;
从那里,您可以通过索引器获取名称和其他内容:
string name = (string)json["name"]; int summonerlevel = (int)json["summonerLevel"]
详细说明,JsonConvert.DeserializeObject(x)将返回一个只有一个对象的新JObject.因此第一个电话.而且,这个对象只有一个名为"gigaxel"的属性.此属性的值是我们需要的信息,例如名称.无论属性的名称是什么,我们都希望检索此信息.因此,我们再次调用First来检索此属性的值.