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


84

我想使用json.net将枚举反序列化为它们的字符串表示形式,反之亦然。我可以弄清楚告诉框架应用它的唯一方法StringEnumConverter是对有问题的属性进行如下注释:

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

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

有没有办法做到这一点,例如在custom的帮助下JsonSerializerSettings

Answers:


113

将一个添加StringEnumConverterJsonSerializerSettingsConverters集合。

文档:使用JsonConverters进行序列化


如果您希望序列化程序使用camelCasing,则也可以进行以下设置:

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

这将序列化SomeValuesomeValue


我尝试将其设置在我的global.asax.cs下,GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings但是没有用。知道为什么会这样吗?
13年

有什么办法可以小写字段名吗?CamelCaseText标志被硬编码到类中,我看不到使用不同大小写策略的方法。
mikebridge

@mikebridge您是否找到了解决方案?还寻找一种方法来自己设置每个枚举选项的名称(或使用小写字母)。
Timm 2014年

1
@Timm是的,我用这个帖子: stackoverflow.com/questions/6288660/...
mikebridge

@mikebridge谢谢。我发现[EnumMember(Value =“ undefined”)]每个枚举条目也可以在JSON.Net上正常工作(尽管不受Microsoft JSON反序列化器支持)
Timm

40

其他答案也适用于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
我在找什么!更短:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
康培


18

在您的Global.asax.cs中添加

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

对于WebAPI序列化,此解决方案似乎完美地工作。谢谢!
查理2014年

5

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

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

        ...

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.