【问题标题】:JSON deserialization with enum types枚举类型的 JSON 反序列化
【发布时间】: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

标签: c# json unity3d enums


【解决方案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))] 装饰你的枚举成员。我已更新我的答案以反映这一点。
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多