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

Leo*_*Leo 83 .net c# json json.net

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

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*ing 111

添加StringEnumConverterJsonSerializerSettings转换器集合.

文档:使用JsonConverters进行序列化


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

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });
Run Code Online (Sandbox Code Playgroud)

这将序列化SomeValuesomeValue.


Gaz*_*Gaz 38

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

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});
Run Code Online (Sandbox Code Playgroud)

(参见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}}};` (2认同)

Igg*_*ggy 18

在你的Global.asax.cs中添加

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
Run Code Online (Sandbox Code Playgroud)


Sim*_*ver 5

For ASP.NET Core 2 do the following:

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

        ...
Run Code Online (Sandbox Code Playgroud)

Please note this is not services.AddJsonOptions(...), it must be tagged onto MVC because you're creating settings for MVC.


Ste*_*hen 5

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

serializerSettings.Converters.Add(
    new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);
Run Code Online (Sandbox Code Playgroud)