枚举类型的 JSON 反序列化

Posted

技术标签:

【中文标题】枚举类型的 JSON 反序列化【英文标题】:JSON deserialization with enum types 【发布时间】:2017-04-10 06:12:57 【问题描述】:

我正在尝试使用 UnityEngine.JsonUtility 从文件中反序列化我的 json 项目。它工作正常,但我的枚举类型没有得到正确转换。我尝试使用 EnumMember 属性,但仍然没有运气。

我该如何解决这个问题?

注意

我正在使用this 解决方案来读取多个文件并将它们存储在数组中。

[Serializable]
public class EquipementItem

    public enum ItemTypes
    
        None,
        Armor,
        Weapon
    

    public enum SlotTypes
    
        Head,
        Shoulders,
        Chest,
        Bracers,
        Gloves,
        Waist,
        Legs,
        Boots,
        Weapon
    

    public int ID;
    public string Name;

    public ItemTypes ItemType;
    public SlotTypes SlotType;

还有json文件


"Items": [

  "ID": "1",
  "Name": "Basic Sword",
  "ItemType": "Weapon",
  "SlotType": "Weapon"
,

  "ID": "2",
  "Name": "Advanced Sword",
  "ItemType": "Weapon",
  "SlotType": "Weapon"
,

  "ID": "3",
  "Name": "Leather Chest",
  "ItemType": "Armor",
  "SlotType": "Chest"

]

这是我加载 json 文件的类:

public class Items : MonoBehaviour

    public static EquipementItem[] EquipableItems;

    private void Awake()
    
        string jsonFile = File.ReadAllText(Application.dataPath + "/Scripts/Databases/EquipableItemsDB.json");
        EquipableItems = JsonHelper.FromJson<EquipementItem>(jsonFile);
    

【问题讨论】:

枚举是下面的整数。您是否尝试过将 JSON 中的“ItemType”设置为 1,将“SlotType”设置为 2? 输入 json 和模型在那里,但我看不到 你的代码 你能把这个作为答案发布吗?成功了! @L.B 你还需要什么?我注意到我正在使用链接答案中显示的解决方案我正在阅读 json,就像它在那里完成的一样 JsonHelper.FromJson&lt;EquipementItem&gt;(jsonString); 这几乎是整个项目,因为这只是一个测试。 @mashinkata 当我在一个问题中测试一个代码时,我想要的只是一个可以复制和粘贴的代码......见How to create a Minimal, Complete, and Verifiable example 【参考方案1】:

您的 JSON 属性都是字符串,因此它们只能反序列化为 String,而 Enum 值实际上是整数。

您应该能够将您的 JSON 更改为以下内容,并且它会很好地反序列化


    "Items": [
    
      "ID": "1",
      "Name": "Basic Sword",
      "ItemType": 2,
      "SlotType": 8
    ,
    
      "ID": "2",
      "Name": "Advanced Sword",
      "ItemType": 2,
      "SlotType": 8
    ,
    
      "ID": "3",
      "Name": "Leather Chest",
      "ItemType": 1,
      "SlotType": 2
    
]

更新

在写这篇文章的时候,我已经忘记了StringEnumConverter 的存在。如果您想在 JSON 模型中保留可读的名称

[Serializable]
public class EquipementItem

    public enum ItemTypes
    
        None,
        Armor,
        Weapon
    

    public enum SlotTypes
    
        Head,
        Shoulders,
        Chest,
        Bracers,
        Gloves,
        Waist,
        Legs,
        Boots,
        Weapon
    

    public int ID  get; set; 

    public string Name  get; set; 

    [JsonConverter(typeof(StringEnumConverter))]
    public ItemTypes ItemType  get; set; 

    [JsonConverter(typeof(StringEnumConverter))]
    public SlotTypes SlotType  get; set; 

【讨论】:

你能提供一个例子,说明如果使用Enum.Parse,你会如何做同样的事情? 我已经更新了我的答案,如果您使用 Newtonsoft.Json,实际上有一种更简单的方法来反序列化枚举 newtonsoft.Json 能否与 Unity 的 JasonUtility 很好地结合? 抱歉,略过了UnityEngine.JsonUtility 的提及,再次更新了答案 - 为了代码的简单性,最好使用整数,因为我怀疑您将在代码中序列化将输出整数并反序列化代码,而不是手动编辑文件。 @KonstantinAbakumov 用[JsonConverter(typeof(StringEnumConverter))] 装饰你的枚举成员。我已更新我的答案以反映这一点。

以上是关于枚举类型的 JSON 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

unity含枚举类型json数据的序列化和反序列化

unity含枚举类型json数据的序列化和反序列化

使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错

如何使用 System.Text.Json 序列化/反序列化非枚举类型的嵌套字典?

使用枚举数组反序列化 json

c# 多个json字符串反序列化