【问题标题】:Json.NET serialize List<System.Enum> and back to concrete typesJson.NET 序列化 List<System.Enum> 并返回具体类型
【发布时间】:2016-06-22 18:13:17
【问题描述】:

我有一个 UserProfile C# 类,其中包含一个公共列表 List&lt;System.Enum&gt; Bonuses;,其每个元素都属于几种具体类型的枚举之一:BonusUIBonusMusicBonusMode 等。

我正在使用 Json.NET,我想序列化/反序列化 UserProfile 对象。我将[JsonConverter(typeof(StringEnumConverter))] 应用于每个具体的枚举类型,以便将它们保存为字符串而不是整数。然而,这还不够,因为保存的枚举值甚至不包含它们的确切类型。

...
"Bonuses": [
    "MainTheme",
    "ClassicUI",
    "WoodUI",
    "Rampage",
    "SoleSurvivor"
],
...

例如,当反序列化器在列表中找到 BonusMusic.MainTheme(序列化为“MainTheme”)时看到此错误:

将值“MainTheme”转换为类型“System.Enum”时出错。

我该如何解决这个问题?

【问题讨论】:

  • 我现在看到它确实与那个问题非常相似。不幸的是,必须为此创建自定义代码,但我想这是一个特定的情况。

标签: c# json serialization enums json.net


【解决方案1】:

作为简单字符串的 MainTheme 不能转换为 Enum。你应该使用类似的东西来解析它

BonusMusic enum = (BonusMusic)Enum.Parse(typeof(BonusMusic), "MainTheme");

也许您可以实现一个 JSON 自定义序列化程序,它可以解析 Bonuses 数组中的值

你可以查看这个JSON.NET Implementing Custom Serialization

问候。

【讨论】:

  • 感谢您的回答。我知道为什么转换不起作用,但希望有一个更简单的解决方案。 :) 因为 Bonuses 列表是一种特殊情况,并且我将其他地方的枚举序列化为整数,所以我最终手动转换了这个特定列表,而不是添加自定义序列化程序类(说实话,这也是手动转换)。这个想法是一样的:在保存时,将列表项转换为像“BonusMusic.MainTheme”这样的字符串并将其序列化。加载时,通过在点上拆分并使用Enum.Parse(Type.GetType(token[0]), token[1]); 将字符串列表转换为正确的枚举
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2019-02-08
相关资源
最近更新 更多