我正在尝试填充此类的属性:
public class Summoner
{
public int id { get; set; }
public string name { get; set; }
public int profileIconId { get; set; }
public int summonerLevel { get; set; }
public long revisionDate { get; set; }
}
使用此JSON:
{"SummonerName":{"id":445312515,"name":"SummonerName","profileIconId":28,"summonerLevel":30,"revisionDate":140642312000}}
将JSON.net与以下内容结合使用:
public static Summoner getRecentGames(string summonerId)
{
Summoner summoner = new Summoner();
try
{
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString("https://eu.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/"+summonerId+"?api_key="+api_key);
webClient.Dispose();
summoner = JsonConvert.DeserializeObject<Summoner>(json);
return summoner;
}
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
return null;
}
属性永远不会赋值,当我需要的值在内部对象中时,它是否与JSON中的外部对象有关?
我是一名新程序员,很抱歉,如果这是一个愚蠢的错误,谢谢。
答案 0 :(得分:3)
您需要JSON包含的SummonerName
属性的包装器:
public class Wrapper
{
public Summoner SummonerName { get; set; }
}
您要将JSON反序列化为:
public static Summoner getRecentGames(string summonerId)
{
try
{
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString("https://eu.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/"+summonerId+"?api_key="+api_key);
var wrapper = JsonConvert.DeserializeObject<Wrapper>(json);
return wrapper.SummonerName;
}
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
return null;
}
另请注意,您的webClient
个实例已包含在using
指令中 - 手动调用.Dispose()
方法完全没有意义 - 这就是using
陈述的全部目的。
更新:
看来SummonerName
属性在您的JSON中是动态的(这是一个非常糟糕的API设计但无论如何)并且意味着您不能使用强类型包装器。
以下是您如何处理此问题:
using (var webClient = new System.Net.WebClient())
{
var json = webClient.DownloadString("https://eu.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/"+summonerId+"?api_key="+api_key);
var summoner = JObject.Parse(json).Values().First().ToObject<Summoner>();
return summoner;
}