我正在尝试制作一个uwp应用程序使用暴动api的传奇联盟。
当我去他们的网站生成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和用户。我的用户名是“gigaxel”。
当我尝试另一个用户名(例如“xenon94”)时,会出现一个异常:
Object reference not set to an instance of an object.
当我将rootobject中的属性名从gigaxel更改为xenon94时,如下所示:
public class Rootobject
{
public Gigaxel xenon94 { get; set; }
}
当我重新编译代码时,它对username
xenon94
有效,但对username"gigaxel"
无效。我希望它对任何给定的用户名都有效。
最佳答案
问题是json对象有一个名为gigaxel的属性。您必须检索内部对象,如下所示:
var json = JsonConvert.DeserializeObject<JObject>(x).First.First;
从那里,您可以通过索引器获取名称和其他信息:
string name = (string)json["name"];
int summonerlevel = (int)json["summonerLevel"]
要详细说明,jsonconvert.deserializeobject(x)将返回一个只有一个对象的新jobject。因此第一个电话。此外,这个对象只有一个属性,名为“gigaxel”。此属性的值是我们需要的信息,例如名称。无论属性的名称如何,我们都希望检索此信息。因此,我们再次调用以检索此属性的值。