我想要以下全局Json.NET配置:
如果Enum类型为Foo
,则对枚举使用默认的序列化逻辑(输出整数值,例如3
)。
否则,请使用StringEnumConverter
(输出字符串值,例如"Red"
)
我想使用全局配置,因为Web API的ApiController会自动将响应转换为JSON。
// Global Json.NET configuration in Global.asax.cs
HttpConfiguration config = GlobalConfiguration.Configuration;
// Serialize enum values as description instead of integers in JSON.
// I wish to conditionally apply this converter.
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new
StringEnumConverter());
当前结果:
始终使用
StringEnumConverter
。这里推荐的解决方案是什么?
最佳答案
您可以通过创建从Json.Net的JsonConverter
派生的自定义StringEnumConverter
来实现。在WriteJson
方法中,检查该值是否为Foo
枚举,如果是,则将其写为整数。否则,请使用基类WriteJson
方法写入该值。 (您无需覆盖ReadJson
,因为StringEnumConverter
已经可以读取字符串和数字值。)
class StringEnumExceptFooConverter : StringEnumConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is Foo || value is Foo?)
{
writer.WriteValue(value);
}
else
{
base.WriteJson(writer, value, serializer);
}
}
}
然后,在您的配置中,将
StringEnumConverter
替换为您的自定义转换器。config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
new StringEnumExceptFooConverter());
演示小提琴(控制台应用程序):https://dotnetfiddle.net/3iUIKT