根据类型配置全局Json.NET转换器

时间:2017-05-22 09:20:24

标签: c# json.net

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

这里推荐的解决方案是什么?

1 个答案:

答案 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