it-swarm.cn

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

我希望使用json.net将枚举反序列化为其字符串表示形式,反之亦然。我可以想出告诉框架应用其StringEnumConverter的唯一方法是注释相关属性,如下所示:

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

但是,在我的用例中,全局配置json.net会更加方便,所有枚举都使用StringEnumConverter进行序列化,而不需要额外的注释。

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

79
Leo

StringEnumConverter添加到JsonSerializerSettings转换器集合中。

文档:使用JsonConverters进行序列化


如果您希望序列化程序使用camelCasing,您也可以设置它:

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

这会将SomeValue序列化为someValue

109
James Newton-King

其他答案适用于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

36
Gaz

在你的Global.asax.cs中添加

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

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

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

        ...

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

2
Simon_Weaver

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

serializerSettings.Converters.Add(
    new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);
0
Stephen