我想要以下全局Json.NET配置:
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
。这里推荐的解决方案是什么?
答案 0 :(得分:1)
您可以通过创建从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