【问题标题】:Deserialize a JSON file which contains an ArrayC# 反序列化包含数组的 Json 文件
【发布时间】:2021-12-27 08:52:01
【问题描述】:

我正在尝试反序列化一个 Json 文件,但由于数组“统计信息”,我目前被卡住了。 我的 Json 文件如下所示:

[
  {
    "name": "itemName",
    "level": 8,
    "imgUrl": "https://imgItemName.png",
    "description": "itemDescription.",
    "statistics": [
    {
        "Vitality": {
          "min": 10,
          "max": 13
        }
    }
    ]
  }
]

我的课是这样的:

public class Item
{
  public string name;
  public int level;
  public string type;
  public string imgUrl;
  public string description;
  public List<Statistics>statistics;
  //public List<JArray> statistics;
  //public Statistics[] statistics;
  
}
public class Statistics
{
 public string Vitality;
  public List<MinMax> minmax;
  //public MinMax[] minMax;
}
public class MinMax
{
  public string min;
  public string max;
}

这就是我试图反序列化文件的方式:

string json = System.IO.File.ReadAllText("items.json");
var listItems = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Item>>(json);

我已经尝试了很多组合,但无论如何都无法恢复 Statistics 键。 任何帮助将不胜感激:)

【问题讨论】:

  • 不要以复数形式命名类,以复数形式命名返回集合的属性,例如List&lt;Statistic&gt; Statistics
  • 活力不包含 [ ],因此不是 minmax 列表。统计量是统计量的列表,统计量具有活力属性,即最小值和最大值的对象。如果您希望类可以工作,请将您的 json 粘贴到 QuickType.io 中(您自己从 json 中提取类并没有什么令人费解的地方;计算机可以更快、更全面地做到这一点)
  • @CaiusJard 我更偏爱json2csharp.com - 但只是因为我是那里的贡献者(I implemented their support for immutable DTOs :))
  • 你的类不代表 JSON,试试这个:stackoverflow.com/questions/21611674/…
  • 感谢我不知道这些网站的答案,但这对我有很大帮助!

标签: c# json deserialization


【解决方案1】:

使用Json2Csharp工具,你的模型应该如下:

public class Vitality
{
    [JsonProperty("min")]
    public int Min { get; set; }

    [JsonProperty("max")]
    public int Max { get; set; }
}

public class Statistic
{
    [JsonProperty("Vitality")]
    public Vitality Vitality { get; set; }
}

public class Root
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("level")]
    public int Level { get; set; }

    [JsonProperty("imgUrl")]
    public string ImgUrl { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("statistics")]
    public List<Statistic> Statistics { get; set; }
}

Sample Demo on .NET Fiddle

【讨论】:

  • public string name { get; set; }
  • 请..打开将 [JsonProperty] 属性放入的选项,这样我们就不会遇到大量 JavaScript 风格的 C#
  • 好的,是的,命名约定应该以Pascal大小写开头,我们可以使用JsonProperty属性来控制名称。感谢您的建议,我现在更正我的答案 =)
  • @YongShun 实际上,我更关心的是对于那些string 属性的状态如何零保证string 是一个引用类型,所有这些属性默认情况下将是null,但是当没有 ctor 来保证这一点时,该类原样暗示一切都是不知何故非空的。
  • @MihailBrinza 您对属性名称是正确的。我正在考虑我自己的代码,我在其中添加了一个 using JsonProperty = System.Text.Json.JsonPropertyName 别名以简化转换。
猜你喜欢
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2015-06-11
  • 2015-05-14
  • 2022-10-14
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多