【问题标题】:Deserialize JSON from Riot API C#从 Riot API C# 反序列化 JSON
【发布时间】:2016-01-21 10:28:29
【问题描述】:

我在用 C# 反序列化来自 RIOT API 的 JSON 响应时遇到了一些问题。我想获取“冠军”列表,API 会返回这样的流:

{  
   "type":"champion",
   "version":"6.1.1",
   "data":{  
      "Thresh":{  
         "id":412,
         "key":"Thresh",
         "name":"Thresh",
         "title":"the Chain Warden"
      },
      "Aatrox":{  
         "id":266,
         "key":"Aatrox",
         "name":"Aatrox",
         "title":"the Darkin Blade"
      },...
    }
}

所有数据都具有相同的属性(id、key、name 和 title),所以我创建了一个冠军类:

public class Champion
    {
        public int id { get; set; }
        public string key { get; set; }
        public string name { get; set; }
        public string title { get; set; }
    }

我需要你的帮助,因为我不知道如何反序列化这些数据...我需要创建一个具有类型、版本和数据属性的 Root 类(数据是冠军列表)?我查看了使用过的 NewtonSoft Json,但没有找到帮助我的示例。

【问题讨论】:

    标签: c# json serialization riot-games-api


    【解决方案1】:

    您可以使用以下根对象(更准确地说是数据传输对象)从 API 中检索冠军。这将返回所有英雄,而无需为每个英雄创建一个类。

    public class RootChampionDTO
    {
        public string Type { get; set; }
        public string Version { get; set; }
        public Dictionary<string, Champion> Data { get; set; }
    }
    

    然后使用 Newtsonsoft 的 Json.NET,您将使用以下内容进行反序列化:

    JsonConvert.DeserializeObject<RootChampionDTO>(string json);
    

    【讨论】:

    • 请注意 Json.NET,如果您对 type 或 version 属性不感兴趣,可以从 RootChampionDTO 类中省略它们,它仍然会反序列化而不会出现任何问题。跨度>
    【解决方案2】:

    如果您想使用 NewtonSoft:

    JsonConvert.DeserializeObject<RootObject>(string json);
    

    Json .NET 文档:http://www.newtonsoft.com/json/help/html/SerializingJSON.htm

    【讨论】:

      【解决方案3】:

      考虑这样的类:

      public class ResponseModel
      {
          public string Type { get; set; }
      
          public string Version { get; set; }
      
          public Dictionary<string, Champion> Data { get; set; }
      }
      
      public class Champion
      {
          public int Id { get; set; }
      
          public string Key { get; set; }
      
          public string Name { get; set; }
      
          public string Title { get; set; }
      }
      

      在使用 Newtonsoft.Json nuget 包反序列化您的 json 之后:

       using Newtonsoft.Json;
      
       var result = JsonConvert.DeserializeObject<ResponseModel>(json);
      

      请注意,Newtonsoft.Json 默认设置允许您正确地将 camelCase 属性从 json 解析为 C# 类中的 PascalCase 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多