2011-09-15 96 views
75

我想用json.net将枚举反序列化为它们的字符串表示,反之亦然。我能想出的唯一办法告诉框架应用其StringEnumConverter是标注有问题的性质是这样的:如何告诉Json.Net全局将StringEnumConverter应用于所有枚举

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

然而,在我的使用情况下,这将是更方便的配置json.net从而使所有枚举都可以使用StringEnumConverter序列化,而不需要额外的注释。

有没有什么办法可以做到这一点,例如在定制JsonSerializerSettings的帮助下?

回答

106

将一个StringEnumConverter添加到JsonSerializerSettings转换器集合。

文档:Serialize with JsonConverters


如果你想串行使用驼峰规则,你可以设置以及:

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

这将序列SomeValuesomeValue

+0

我试着在'GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings'下的global.asax.cs中设置它,但没有奏效。任何想法为什么这可能是? – amhed

+0

有什么办法来降低字段名称? CamelCaseText标志被硬编码到类中,我没有看到使用不同套管策略的方法。 – mikebridge

+0

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

18

在你的Global.asax.cs添加

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

该解决方案似乎完美适用于WebAPI序列化。谢谢! – chuck

34

其他的答案为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

+1

我在找什么!甚至更短: 'JsonConvert.DefaultSettings =()=>新的JsonSerializerSettings { 转换器= {new StringEnumConverter {CamelCaseText = true}} };' –

0

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

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

     ... 

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