如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举

Posted

技术标签:

【中文标题】如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举【英文标题】:How to tell Json.Net globally to apply the StringEnumConverter to all enums 【发布时间】:2011-11-17 16:19:04 【问题描述】:

我想用 json.net 将枚举反序列化为它们的字符串表示形式,反之亦然。我能想出告诉框架应用其StringEnumConverter 的唯一方法是像这样注释有问题的属性:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum  get; set; 

但是,在我的用例中,全局配置 json.net 会方便得多,这样所有枚举都可以使用 StringEnumConverter 进行(反)序列化,而无需额外的注释。

有没有办法做到这一点,例如在自定义JsonSerializerSettings的帮助下?

【问题讨论】:

【参考方案1】:

StringEnumConverter 添加到JsonSerializerSettings 转换器集合。

文档:Serialize with JsonConverters


如果你想让序列化器使用camelCasing,你也可以设置这个:

SerializerSettings.Converters.Add(
    new StringEnumConverter  CamelCaseText = true );

这会将SomeValue 序列化为someValue

【讨论】:

我尝试在我的 global.asax.cs 上的 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings 下进行设置,但没有成功。知道为什么会这样吗? 有没有办法将字段名小写? CamelCaseText 标志被硬编码到类中,我看不到使用不同大小写策略的方法。 @mikebridge 你找到解决方案了吗?也在寻找一种方法来自己设置每个枚举选项的名称(或使用小写)。 @Timm 是的,我用过这个帖子:***.com/questions/6288660/… @mikebridge 谢谢。我发现每个枚举条目的 [EnumMember (Value = "undefined")] 也适用于 JSON.Net(尽管 Microsoft 的 JSON 反序列化器不支持)【参考方案2】:

其他答案适用于 ASP.NET,但如果您想设置这些设置以在任何上下文中调用 JsonConvert,您可以这样做:

JsonConvert.DefaultSettings = (() =>

    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter CamelCaseText = true);
    return settings;
);

(见http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data)

【讨论】:

我在找什么!更短:JsonConvert.DefaultSettings = () => new JsonSerializerSettings Converters = new StringEnumConverter CamelCaseText = true ; 你救了我!多谢兄弟! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e【参考方案3】:

在你的 Global.asax.cs 添加

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

【讨论】:

这个解决方案似乎非常适合 WebAPI 序列化。谢谢!【参考方案4】:

对于 ASP.NET Core 2,请执行以下操作:

    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc()
                .AddJsonOptions(options =>
                
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                );

        ...

请注意,这不是services.AddJsonOptions(...),它必须标记到 MVC 上,因为您正在为 MVC 创建设置。

【讨论】:

【参考方案5】:

从版本 12.0.1 开始,之前的答案已经过时。新方法是使用 NamingStrategy。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

serializerSettings.Converters.Add(
    new StringEnumConverter  NamingStrategy = new CamelCaseNamingStrategy() 
);

【讨论】:

以上是关于如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举的主要内容,如果未能解决你的问题,请参考以下文章

通过装饰覆盖一个特定枚举的全局 Json.NET 枚举处理

是否可以将Json.Net设置为忽略$ type?

使用 json.net 反序列化没有类型信息的多态 json 类

如何使用 json.net 将 c# 通用列表转换为 json?

如何使用 json.net 将 c# 通用列表转换为 json?

如何告诉 JSLint / JSHint 已经定义了哪些全局变量