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

时间:2011-09-15 08:25:50

标签: c# .net json json.net

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

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

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

有没有办法这样做,例如借助自定义JsonSerializerSettings

5 个答案:

答案 0 :(得分:109)

StringEnumConverter添加到JsonSerializerSettings转换器集合。

文档: Serialize with JsonConverters


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

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

这会将SomeValue序列化为someValue

答案 1 :(得分:36)

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

答案 2 :(得分:18)

在Global.asax.cs中添加

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

答案 3 :(得分:2)

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

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

        ...

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

答案 4 :(得分:0)

先前的答案自版本12.0.1起已过时。新方法是使用NamingStrategy。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

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