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

标签 c# serialization json.net

问题

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

public enum ResultState
{
    Found,
    Deleted,
    NotFound
}

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

我正在使用 JSON.NET

到目前为止的故事

我的一切工作几乎都正常 - 枚举通过 StringEnumConverter 全局转换为字符串,但是我无法在我的生活中看到如何实现与上述类似的东西。

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

可能的解决方案?

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

如您所想,我不喜欢这个想法。

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

最佳答案

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

我使用了 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());

关于c# - 通过属性在(反)序列化期间控制枚举值格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178593/

相关文章:

c# - 设置触发器在开始后5分钟调用,然后每天10点:00

c# - Web 内容在 ChromiumFX 中呈现两次

c# - 在 SilverLight 网页中保存数据

java - 在不实现 Serializable 接口(interface)的情况下对字段进行序列化

c# - 如何使 JSON.NET 反序列化为 Microsoft 日期时间?

c++ - 使用 Asio (Boost) 通过网络发送灵活数量的数据

c# - JSON.Net Xml 序列化误解了数组

c# - 在 C# 中计算数组频率分布的最快方法是什么?

c# - 如何反序列化包含 JSON.NET 中的字符串和对象的数组

c# - 在 C# 中循环遍历 json 响应