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

本文关键字:控制 枚举 格式 序列化 属性 | 更新日期: 2023-09-27 18:10:39

问题

让我们假设我有一个枚举表示的东西:

public enum ResultState
{
    Found,
    Deleted,
    NotFound
}

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

我使用JSON。

到目前为止的故事

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

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

潜在解决方案吗?

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

你可以想象,我不喜欢这种想法。

我想知道你们这些了不起的人是否可以建议一个更简单的替代方案?

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

碰巧我对整件事想得太多了。

我使用了System.Runtime.SerializationEnumMember属性,它工作得很好。

这是我的新枚举的完整性:

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());