2011-09-15 33 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創建設置。