【问题标题】:C# Parsing JSON numeric property using JSON.NetC# 使用 JSON.Net 解析 JSON 数字属性
【发布时间】:2014-09-26 19:10:10
【问题描述】:

我正在尝试解析以以下结构返回给我的 JSON,但我无法正确获取类的结构以使其正确解析:

{"44542152": [{
   "queue": "RANKED_SOLO_5x5",
   "name": "Elise's Elite",
   "entries": [{
      "leaguePoints": 0,
      "isFreshBlood": false,
      "isHotStreak": false,
      "division": "IV",
      "isInactive": false,
      "isVeteran": false,
      "playerOrTeamName": "Autdsm",
      "playerOrTeamId": "44543152",
      "wins": 11
   }],
   "tier": "SILVER"
}]}

但是,由于“44542152”:JSON 的根会根据我请求的用户而变化,我发现很难将其解析为对象。

这是我目前所拥有的:

public static AreTheyChallenger.Core.RankInfo getLeague(string region, Summoner summoner)
    {
        try
        {
            using (var webClient = new WebClient())
            {
                var json = webClient.DownloadString("https://" + region + ".api.pvp.net/api/lol/" + region + "/v2.5/league/by-summoner/" + summoner.id + "/entry" + "?api_key=" + Keys.api_key);
                var summonerRankInfo = JObject.Parse(json).Values().First().ToObject<RankInfo>();
                return summonerRankInfo;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        return null;
    }

这是我试图将其解析为的类:

public class RankInfo
{

    public class Entry
    {
        public int leaguePoints { get; set; }
        public bool isFreshBlood { get; set; }
        public bool isHotStreak { get; set; }
        public string division { get; set; }
        public bool isInactive { get; set; }
        public bool isVeteran { get; set; }
        public string playerOrTeamName { get; set; }
        public string playerOrTeamId { get; set; }
        public int wins { get; set; }
    }

    public class RootObject
    {
        public string queue { get; set; }
        public string name { get; set; }
        public List<Entry> entries { get; set; }
        public string tier { get; set; }
    }

}

我对此很陌生,如果问题很明显,我很抱歉,但我的目的是能够访问一些存储的属性并将它们呈现给用户。

提前致谢。

【问题讨论】:

  • 尝试使用它来生成您的课程:jsonclassgenerator.codeplex.com 非常方便 IMO :)
  • 问题很明显,但解决方案肯定不是。好问题:)
  • 如果您不想下载任何东西,也可以使用 json2csharp。 json2csharp.com
  • 感谢您的 cmets :) 我一直在使用这样的工具,但事实证明它没有考虑数组,我也没有考虑,这就是问题所在。

标签: c# json parsing json.net


【解决方案1】:

你们很亲密。

这应该是你演员表中的 RootObject[]。再次查看您的 JSON...如果您正确缩进它会更有帮助。它将字符串映射到对象数组,而不是单个对象,这些对象是您的 RootObject,而不是 RankInfo。

【讨论】:

    【解决方案2】:

    您可能想要更改嵌套类,如下所示。请让我知道这是不是故意的。

    void Main()
    {
        string jsonString = "{'44542152': [{ 'queue': 'RANKED_SOLO_5x5', 'name': 'Elises Elite', 'entries': [{ 'leaguePoints': 0, 'isFreshBlood': false, 'isHotStreak': false, 'division': 'IV', 'isInactive': false, 'isVeteran': false, 'playerOrTeamName': 'Autism', 'playerOrTeamId': '44543152', 'wins': 11 }], 'tier': 'SILVER' }]}".Replace('\'','"');
    
        JObject jsonObject = JObject.Parse(jsonString);
        JArray jsonArray = jsonObject.Values().First() as JArray;
        var summonerRankInfo = jsonArray.First().ToObject<RootObject>();
    }
    
    public class Entry
    {
        public int leaguePoints { get; set; }
        public bool isFreshBlood { get; set; }
        public bool isHotStreak { get; set; }
        public string division { get; set; }
        public bool isInactive { get; set; }
        public bool isVeteran { get; set; }
        public string playerOrTeamName { get; set; }
        public string playerOrTeamId { get; set; }
        public int wins { get; set; }
    }
    
    public class RootObject
    {
        public string queue { get; set; }
        public string name { get; set; }
        public List<Entry> entries { get; set; }
        public string tier { get; set; }
    }
    

    【讨论】:

    • 这是问题之一,另一个是我需要考虑json中的数组。
    • 请查看 jsonArray 变量。它保存帐户的每条记录。
    • 对不起,我忽略了这一点,很好的回复我已经改进了我的代码 - 谢谢。
    【解决方案3】:

    您的RankInfo 类没有成员,只有类定义。也许您的意思是让它拥有一个 RootObject 的实例?

    您可以通过将 JSON 反序列化行稍微修改为以下内容来获取 RootObject 的实例:

    var summonerRankInfo = JObject.Parse(json).Values().First().First.ToObject<RankInfo.RootObject>();
    

    您还可以执行以下操作(如果您要接收多个RootObjects:

    var summonerRankInfo = JObject.Parse(json).Values().First().ToObject<RankInfo.RootObject[]>();
    

    【讨论】:

    • 非常感谢,结合上面的答案解决了我的问题。
    【解决方案4】:

    这就是我所做的:

    var data = JsonConvert.DeserializeObject<Dictionary<string,IList<RankInfo.RootObject>>>( json );
    var rankinfo = data["44542152"].First();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多