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&lt;int, string&gt;

有没有办法,如何使用属性来做到这一点?

【问题讨论】:

编写自定义 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时,如何将单个枚举序列化为数字[重复]

来自 json 的原型反序列化将在新字段或未知枚举值上失败

c# 多个json字符串反序列化