JSON 序列化 - 将枚举转换为数字
Posted
技术标签:
【中文标题】JSON 序列化 - 将枚举转换为数字【英文标题】:JSON serialization - convert enum to number 【发布时间】:2015-11-11 01:27:06 【问题描述】:我在 C# 后端使用枚举定义了设置,每个设置都有唯一的编号。
public enum Settings
Setting1 = 1,
Setting2 = 2,
//...
我使用字典中的 WebAPI 将设置发送给客户端
public MyModel
public Dictionary<Settings, string> MySettings get; set;
//...other properties...
但问题是我在 typescript 中也定义了这个枚举,我想使用枚举来引用它。
问题是 WebAPI 将枚举转换为字符串而不是数字。由于解决方案非常大,我不想从配置中删除 StringEnumConverter,只需将转换器定义为该属性的数字,并保留字典的类型而不将其更改为 Dictionary<int, string>
。
有没有办法,如何使用属性来做到这一点?
【问题讨论】:
编写自定义 json 转换器并使用自定义转换器注释您的属性 @entre 我想知道一种更简单的方法,但正如我所见,我可能不会避免这个选项。 另一种方式可能是.. 从字符串派生到枚举转换器,如果枚举类型是您的枚举,则覆盖可以转换为返回 false,否则返回 base.canconvert... 应该比以前的变化更小跨度> 【参考方案1】:您可以拥有可以使用的私有/受保护财产 你要。您还可以制作这些标准的 get/set 方法并将它们公开。
public class MyModel
public Dictionary<int, string> MySettings get; set;
//One way of handling it.
private Dictionary<Settings, string> MyBetterSettings
get return MySettings.ToDictionary(setting => (Settings) setting.Key, setting => setting.Value);
set MySettings = value.ToDictionary(setting => (int) setting.Key, setting => setting.Value);
//Simple C# 6 methods
public Dictionary<Settings, string> GetSettings => MySettings.ToDictionary(setting => (Settings) setting.Key, setting => setting.Value);
public void SetSettings(Dictionary<Settings, string> settings) => MySettings = settings.ToDictionary(setting => (int)setting.Key, setting => setting.Value);
这不是最好的,但它是一个很好的权衡,不必担心改变它的序列化方式。
【讨论】:
通用序列化解决方案会更优雅,但就我的目的而言,这很好。谢谢。以上是关于JSON 序列化 - 将枚举转换为数字的主要内容,如果未能解决你的问题,请参考以下文章
使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错
在 ASP.NET MVC 中设置默认 JSON 序列化程序
System.Text.Json:当json配置具有通用JsonStringEnumConverter时,如何将单个枚举序列化为数字[重复]