You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework迁移.NET 6:JSON空值转非Nullable Enum问题

解决.NET 6中Newtonsoft.Json处理非可空Enum传null的兼容问题

自定义Enum转换器实现

直接继承JsonConverter,拦截null值并替换为枚举的首个定义值:

public class NullToDefaultEnumConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 匹配非可空/可空枚举类型
        var enumType = Nullable.GetUnderlyingType(objectType) ?? objectType;
        return enumType.IsEnum;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 处理前端传入null的场景
        if (reader.TokenType == JsonToken.Null)
        {
            var enumType = Nullable.GetUnderlyingType(objectType) ?? objectType;
            // 获取枚举的第一个定义值
            var enumValues = Enum.GetValues(enumType);
            return enumValues.GetValue(0);
        }

        // 非null场景沿用默认序列化逻辑
        return serializer.Deserialize(reader, objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 序列化时保持默认行为
        serializer.Serialize(writer, value);
    }
}

配置到Startup中

替换你当前的AddNewtonsoftJson配置,移除不必要的自定义JsonContractResolver,添加自定义转换器:

.AddNewtonsoftJson(opts =>
{
    // 保持属性名原样(对应原配置的PropertyNamingPolicy = null)
    opts.SerializerSettings.ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = null
    };
    opts.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
    // 注册自定义转换器
    opts.SerializerSettings.Converters.Add(new NullToDefaultEnumConverter());
})

说明

  • 该转换器会自动识别所有枚举类型,当前端传入null给非可空枚举属性时,自动替换为枚举定义的第一个值(而非默认的0值,避免枚举无0定义时出现异常)。
  • 保留了原有整数枚举的序列化/反序列化逻辑,无需继承StringEnumConverter。

内容的提问来源于stack exchange,提问作者Verthosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:47:34