通过属性在(反)序列化期间控制枚举值格式

Dan*_*Dan 3 c# serialization json.net

问题

假设我有一个表示某事或其他内容的枚举:

public enum ResultState
{
    Found,
    Deleted,
    NotFound
}
Run Code Online (Sandbox Code Playgroud)

在我的序列化JSON,我想这些值序列化为"found","gone"或者"not_found"分别.(注意:这不是 camelCase,而是完全自定义的字符串!)

我正在使用JSON.NET

迄今为止的故事

我的一切工作几乎都是正确的 - 枚举通过全局转换为字符串StringEnumConverter,但我不能为我的生活看到如何实现类似于上面的东西.

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

潜在解决方案

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

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

我想知道你是不是很棒的人会建议一个更简单的选择?

Dan*_*Dan 9

碰巧的是,我在思考整件事.

我使用了EnumMember属性System.Runtime.Serialization,这很有用.

这是我完整性的新枚举:

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

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

    [EnumMember(Value="not_found")]
    NotFound
}
Run Code Online (Sandbox Code Playgroud)

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

JsonConvert.SerializeObject(someObjectWithAnEnum, new StringEnumConverter());
Run Code Online (Sandbox Code Playgroud)