我希望使用json.net将枚举反序列化为其字符串表示形式,反之亦然。我可以告诉框架应用其StringEnumConverter
的唯一方法是注释相关属性,如下所示:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
但是,在我的用例中,全局配置json.net会更方便,所有枚举都使用StringEnumConverter
进行序列化,而不需要额外的注释。
有没有办法这样做,例如借助自定义JsonSerializerSettings
?
答案 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;
});
答案 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() }
);