我想要以下全局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

08-27 05:13