在 .NET 中反序列化 Pokemon API

Posted

技术标签:

【中文标题】在 .NET 中反序列化 Pokemon API【英文标题】:Deserializing Pokemon API in .NET 【发布时间】:2021-03-02 10:00:09 【问题描述】:

我正在尝试反序列化位于https://pokeapi.co/api/v2/pokemon/3 的口袋妖怪 API,而且我对使用 json 比较陌生。我已经创建了一个类和方法,可以将我选择的任何 pokemon 加载到一个对象中,但只能让它使用像“name: value”和“id: value”这样的简单键


 class Pokemon
    
        [JsonProperty("id")]
        public int Id  get; set; 

        [JsonProperty("name")]
        public string Name  get; set; 

      //  [JsonProperty("abilities")]
      //  public Dictionary<string, string>[] Abilities  get; set; 

        //[JsonProperty("types")]
        // public Dictionary<string, int>[] Types  get; set; 

        //[JsonProperty("sprites")]
        //public Dictionary<string, string> Sprites  get; set; 

        public static Pokemon LoadPokemon(int num)
          
            string json = new WebClient().DownloadString($"https://pokeapi.co/api/v2/pokemon/num");
            Pokemon pokemon = JsonConvert.DeserializeObject<Pokemon>(json);
            return pokemon;
        
    

我已注释掉的所有我无法工作的字段。基本上我的问题是如何使我注释掉的那些字段实际加载。我已经尝试过将字典、数组和列表组合为数据类型,但我似乎无法使任何工作。

 "sprites": 
    "back_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/3.png",
    "back_female": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/female/3.png",
    "back_shiny": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/shiny/3.png",
    "back_shiny_female": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/shiny/female/3.png",
    "front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png",
    "front_female": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/female/3.png",
    "front_shiny": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/shiny/3.png",
    "front_shiny_female": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/shiny/female/3.png",
    "other": 
      "dream_world": 
        "front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/3.svg",
        "front_female": null
      ,
      "official-artwork": 
        "front_default": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/3.png"
      
    ,

'解析值时遇到意外字符:。路径“sprites.other”,第 1 行,位置 189387。这是我尝试加载精灵时的常见错误消息,其他属性也有类似的错误。我可以看到为什么“其他:”键不能与 Dict 一起使用,但我也不知道如何避免这个问题,因为不是精灵中的每个键都具有这种格式。

我也在使用 NewtonSoft.Json 和 System.Net 包。您可以在 https://pokeapi.co/ 找到 API 的缩写版本。

【问题讨论】:

请不要添加不相关的标签(即[ASP.NET])。 请在您的问题中包含一个简短的 JSON 示例。 【参考方案1】:

尝试为非常复杂的 JSON 文档找出正确的 C# 结构可能非常困难。我建议您首先使用众多在线 JSON 到 C# 转换器工具之一(例如 https://app.quicktype.io/ 或 Google“JSON 到 C#”)来获取示例 JSON 文档并生成您的类模型。使用来自https://pokeapi.co/ 的示例 JSON,我使用 quicktype 工具立即生成 C# 模型。然后,您可以获取该 C# 代码并对其进行修改以满足您的需要(为每个类创建单独的文件,删除不需要的属性等)。但至少这为您提供了一个好的(有效的)起点。诸如 quicktype 之类的工具具有配置选项,可让您优化模型,例如是否希望 JSON 数组为 C# 数组或列表等。

【讨论】:

【参考方案2】:

您示例中的“sprites”将解析为Dictionary&lt;string, object&gt;。然后,您必须在代码中将值转换为 string,或者在“dream_world”和“official_artwork”的情况下将值转换为另一个 Dictionary&lt;string, object&gt;

【讨论】:

以上是关于在 .NET 中反序列化 Pokemon API的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Basic .NET 中反序列化 JSON

是否可以确定在 Json.Net 中反序列化了哪些属性? [复制]

如何在 asp.net 中反序列化 Json-Object

如何使用 Gson @SerializedName 注释在 Kotlin 中反序列化嵌套的 Json API 响应

在Visual Basic .NET中反序列化JSON

如何在 .NET 中反序列化为本地集合?