从JSON字符串获取/设置C#键值对(不带JSON.NET)

时间:2014-04-08 20:01:55

标签: c# json parsing

我有一个解析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();
    }

我必须做些什么才能再次正确使用召唤师?

2 个答案:

答案 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课程重命名为SummonerSummonerDto以匹配API。)