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

C# 使用枚举类型进行JSON反序列化,c#,json,unity3d,enums,C#,Json,Unity3d,Enums,我正在尝试使用UnityEngine.JsonUtility从文件中反序列化json项。它工作正常,但我的枚举类型没有得到正确转换。我尝试使用EnumMember属性,但仍然没有成功。 我如何解决这个问题? 注意 我正在使用该解决方案读取多个文件并将它们存储在数组中 [Serializable] public class EquipementItem { public enum ItemTypes { None, Armor, We

我正在尝试使用
UnityEngine.JsonUtility
从文件中反序列化json项。它工作正常,但我的枚举类型没有得到正确转换。我尝试使用
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;
}
和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);
    }
}
公共类项目:单一行为
{
公共静态设备[]设备项;
私人空间
{
字符串jsonFile=File.ReadAllText(Application.dataPath+“/Scripts/Databases/equalableitemsdb.json”);
equitableItems=JsonHelper.FromJson(jsonFile);
}
}

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

您应该能够将您的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模型中保留可读的名称

[可序列化]
公共级设备
{
公共枚举项类型
{
没有一个
盔甲,
武器
}
公共枚举SlotTypes
{
头,,
肩膀,
胸,
护腕,
手套
腰围,
腿,
靴子,
武器
}
公共int ID{get;set;}
公共字符串名称{get;set;}
[JsonConverter(类型(StringEnumConverter))]
公共ItemTypes ItemType{get;set;}
[JsonConverter(类型(StringEnumConverter))]
公共SlotTypes SlotTypes{get;set;}
}

Enum下面是整数。您是否尝试过将JSON中的“ItemType”设置为1,将“SlotType”设置为2?输入JSON,模型就在那里,但我看不到您的代码。您可以将此作为答案发布吗?成功了@L.B你还需要什么?我注意到我使用的是链接答案中显示的解决方案,我阅读json的方式与这里的方式相同
JsonHelper.FromJson(jsonString)这几乎就是整个项目,因为这只是一个测试。@mashinkta当我测试一个问题中的代码时,我想要的只是一个可以复制和粘贴的代码。。。。请看,您能否提供一个示例,说明如何使用
Enum.Parse
执行相同的操作?我已经更新了我的答案,如果您使用Newtonsoft.Json,实际上有一种更简单的方法来反序列化Enum。Newtonsoft.Json会与Unity的JasonUtility很好地结合吗?抱歉,浏览了一下提到的
UnityEngine.JsonUtility
,再次更新了答案-为了代码的简单性,最好使用整数,因为我怀疑您将在代码中序列化以输出整数,并在代码中反序列化,而不是手动编辑文件。@KonstantinAbakumov用
[JsonConverter]装饰您的枚举成员(typeof(StringEnumConverter))]
。我已经更新了答案以反映这一点。