.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
相关产品推荐
相关产品推荐

