我有一个解析KeyValue类中的JSON字符串的工作示例。
由于某种原因,它现在返回0和/或空值。
public class KeyValue
{
//example JSON string: {"SomeCoolPlayerName":{"id":32179899,"name":"SomeCoolPlayerName","profileIconId":547,"summonerLevel":30,"revisionDate":1396953413000}}
public long id {get; set;}
public string name {get; set;}
public int profileIconId {get; set;}
public long summonerLevel {get; set;}
public long revisionDate {get; set;}
// public List<int> champions {get; set;}
}
JSON字符串是否已更改?当我调试时它会被填充,我可以看到它,所以我将它添加为^^
上面的注释网页代码也非常简单:
try
{
WebClient client = new WebClient();
var strJSON = client.DownloadString("http://prod.api.pvp.net/api/lol/na/v1.4/summoner/by-name/" + SummonerName + "?api_key=blanked_on_purpose");
JavaScriptSerializer ser = new JavaScriptSerializer();
var KeyValue = ser.Deserialize<KeyValue>(strJSON);
var summonerId = KeyValue.id;
//var summonerLevel = KeyValue.summonerLevel;
txtSummonerId.Text = summonerId.ToString();
}
我必须做些什么才能再次正确使用召唤师?
答案 0 :(得分:2)
在您提供的JSON中,id
不在根对象中,而是嵌套在名称SomeCoolPlayerName
下。这很容易用字典表示:
var strJSON = @"{""SomeCoolPlayerName"":{""id"":32179899,""name"":""SomeCoolPlayerName"",""profileIconId"":547,""summonerLevel"":30,""revisionDate"":1396953413000}}";
JavaScriptSerializer ser = new JavaScriptSerializer();
var dict = ser.Deserialize<Dictionary<string, KeyValue>>(strJSON);
// use this if you know the name
var summonerId = dict["SomeCoolPlayerName"].id; // 32179899
// or this if you know there's only one value in the dictionary
var summonerId = dict.Single().Value.id; // 32179899
答案 1 :(得分:1)
是的,数据已经改变。来自Change Announcement:
Summoners的新API版本
...
响应将每个召唤者ID(或名称)映射到包含所请求的召唤者数据的JSON对象。
...
您必须更改致电DownloadString()
的版本号。自v1.3起,它一直返回Map
,你正在调用v1.4。当API版本号发生变化时,您应期望更改响应,并检查文档是否有。
现在您的商品已包含在Map
中,您需要将其反序列化为Dictionary<string, KeyValue>
。根据{{3}},键&#34;是所有小写的召唤者名称,并删除了空格&#34;。
string key = SummonerName.ToLower().Replace(" ", "");
var KeyValue = ser.Deserialize<Dictionary<string, KeyValue>>(strJSON)[key];
(就我个人而言,我将KeyValue
课程重命名为Summoner
或SummonerDto
以匹配API。)