【问题标题】:Control enum value format during (de)serialization via attributes通过属性(反)序列化期间控制枚举值格式
【发布时间】:2013-04-23 20:28:28
【问题描述】:

问题

假设我有一个枚举代表某事或其他:

public enum ResultState
{
    Found,
    Deleted,
    NotFound
}

在我的序列化 json 中,我希望将这些值分别序列化为 "found""gone""not_found"。 (注意:这不是 camelCase,而是一个完全自定义的字符串!)

我正在使用 JSON.NET

迄今为止的故事

我的一切工作几乎正常 - 枚举通过 StringEnumConverter 全局转换为字符串,但是我无法终生了解如何实现与上述类似的目标。

我最初的想法是将JsonProperty(...) 属性应用于相关的枚举值,但这似乎不起作用!

可能的解决方案?

我能想到完成这项工作的唯一方法是编写我自己的 JsonConverter 继承自 StringEnumConverter,但需要一些额外的魔法来处理我要创建的新 JsonName 属性。

正如你想象的那样,我不喜欢这个想法。

我想知道你们这些优秀的人是否可以提出一个更简单的替代方案?

【问题讨论】:

  • 创建一个新的转换器子类非常容易。你可能会在你问这个问题的时候做到这一点:)
  • 您可能是对的,但我想要一种更具声明性的方法。原来EnumMemberAttribute 一直盯着我看。 掌心

标签: c# serialization json.net


【解决方案1】:

碰巧,我想太多了。

我使用了System.Runtime.Serialization 中的EnumMember 属性,效果很好。

为了完整起见,这是我的新枚举:

public enum QueryResultState
{
    [EnumMember(Value="found")]
    Found,

    [EnumMember(Value="gone")]
    Deleted,

    [EnumMember(Value="not_found")]
    NotFound
}

在调用 JsonConvert.Serialize(...) 时不要忘记包含 StringEnumConverter,因为 JSON.NET 默认将枚举序列化为整数:

JsonConvert.SerializeObject(someObjectWithAnEnum, new StringEnumConverter());

【讨论】:

  • 我不明白这是怎么回事?我尝试了QueryResultState r = QueryResultState.Deleted; var r2 = JsonConvert.SerializeObject(new { a = r }); 并得到了{"a":1}
  • 除了上述之外,还需要用到StringEnumConverter。在 SerializeObject 重载上传递一个。
  • 有什么理由不在您的答案中包含此信息?
  • 这是我最初的问题 - 大约一半。
  • 丹,您的回答中没有任何东西将EnumMember 连接到StringEnumConverter。为未来的读者思考并完成您的答案。在那之前-1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多