【问题标题】:Configure global Json.NET converter based on type根据类型配置全局 Json.NET 转换器
【发布时间】:2017-05-22 09:20:24
【问题描述】:

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

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

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    您可以通过创建从 Json.Net 的 StringEnumConverter 派生的自定义 JsonConverter 来做到这一点。在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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2012-06-22
      • 2011-01-15
      • 2012-01-25
      • 2017-06-22
      • 2017-07-31
      相关资源
      最近更新 更多