使用枚举类型进行 JSON 反序列化

mas*_*ata 3 c# enums json unity-game-engine

我正在尝试使用UnityEngine.JsonUtility. 它工作正常,但我的枚举类型没有得到正确转换。我尝试使用该EnumMember属性,但仍然没有运气。

我该如何解决?

笔记

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

[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;
}
Run Code Online (Sandbox Code Playgroud)

和 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"
}
]}
Run Code Online (Sandbox Code Playgroud)

这是我加载 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Col*_*inM 5

您的 JSON 属性都是字符串,因此它们只能反序列化为 a 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
    }
]}
Run Code Online (Sandbox Code Playgroud)

更新

在写这篇文章的时候,我已经忘记了它的StringEnumConverter存在。如果您想在 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
    }
]}
Run Code Online (Sandbox Code Playgroud)