枚举类型的 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<EquipementItem>(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 反序列化的主要内容,如果未能解决你的问题,请参考以下文章
使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错