如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举
Posted
技术标签:
【中文标题】如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举【英文标题】:How to tell Json.Net globally to apply the StringEnumConverter to all enums 【发布时间】:2011-11-17 16:19:04 【问题描述】:我想用 json.net 将枚举反序列化为它们的字符串表示形式,反之亦然。我能想出告诉框架应用其StringEnumConverter
的唯一方法是像这样注释有问题的属性:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum get; set;
但是,在我的用例中,全局配置 json.net 会方便得多,这样所有枚举都可以使用 StringEnumConverter
进行(反)序列化,而无需额外的注释。
有没有办法做到这一点,例如在自定义JsonSerializerSettings
的帮助下?
【问题讨论】:
【参考方案1】:将StringEnumConverter
添加到JsonSerializerSettings
转换器集合。
文档:Serialize with JsonConverters
如果你想让序列化器使用camelCasing,你也可以设置这个:
SerializerSettings.Converters.Add(
new StringEnumConverter CamelCaseText = true );
这会将SomeValue
序列化为someValue
。
【讨论】:
我尝试在我的 global.asax.cs 上的GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
下进行设置,但没有成功。知道为什么会这样吗?
有没有办法将字段名小写? CamelCaseText 标志被硬编码到类中,我看不到使用不同大小写策略的方法。
@mikebridge 你找到解决方案了吗?也在寻找一种方法来自己设置每个枚举选项的名称(或使用小写)。
@Timm 是的,我用过这个帖子:***.com/questions/6288660/…
@mikebridge 谢谢。我发现每个枚举条目的 [EnumMember (Value = "undefined")] 也适用于 JSON.Net(尽管 Microsoft 的 JSON 反序列化器不支持)【参考方案2】:
其他答案适用于 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)
【讨论】:
我在找什么!更短:JsonConvert.DefaultSettings = () => new JsonSerializerSettings Converters = new StringEnumConverter CamelCaseText = true ;
你救了我!多谢兄弟! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e【参考方案3】:
在你的 Global.asax.cs 添加
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
(new Newtonsoft.Json.Converters.StringEnumConverter());
【讨论】:
这个解决方案似乎非常适合 WebAPI 序列化。谢谢!【参考方案4】:对于 ASP.NET Core 2,请执行以下操作:
public void ConfigureServices(IServiceCollection services)
services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.Converters.Add(new StringEnumConverter());
);
...
请注意,这不是services.AddJsonOptions(...)
,它必须标记到 MVC 上,因为您正在为 MVC 创建设置。
【讨论】:
【参考方案5】:从版本 12.0.1 开始,之前的答案已经过时。新方法是使用 NamingStrategy。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm
serializerSettings.Converters.Add(
new StringEnumConverter NamingStrategy = new CamelCaseNamingStrategy()
);
【讨论】:
以上是关于如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举的主要内容,如果未能解决你的问题,请参考以下文章
使用 json.net 反序列化没有类型信息的多态 json 类
如何使用 json.net 将 c# 通用列表转换为 json?