Json.net没有填充类属性C#

时间:2014-07-26 21:15:12

标签: c# .net json json.net

我正在尝试填充此类的属性:

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中的外部对象有关?

我是一名新程序员,很抱歉,如果这是一个愚蠢的错误,谢谢。

1 个答案:

答案 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;
}