如何用System.Text.Json忽略枚举属性的Null值?(.NET 6)
解决方案
首先明确:JsonIgnoreCondition.WhenWritingNull仅控制**序列化(对象转JSON)**时是否忽略null属性,和反序列化(JSON转对象)无关,这就是你当前设置无效的原因。
针对枚举属性遇null反序列化失败的问题,提供两种实用方案:
方案一:将枚举属性改为可空类型(推荐)
把值类型的枚举属性声明为可空枚举,这样JSON中的null可以被正确反序列化为null,不会触发异常。
示例:
// 原代码 public OrderStatus OrderStatus { get; set; } // 修改后 public OrderStatus? OrderStatus { get; set; }
这种方式最简单,符合.NET类型系统设计,也能完美匹配你想要的"忽略null值"效果——当JSON中该属性为null时,属性值会设为null,而非强制赋值为枚举默认值。
方案二:自定义转换器处理null枚举(无需修改属性类型)
如果无法修改现有属性的类型,可以自定义一个JSON转换器,专门处理枚举类型的null值,将其转换为枚举的默认值(或你需要的逻辑)。
步骤1:实现自定义转换器
public class NullSafeEnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum { public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 遇到null时返回枚举的默认值 if (reader.TokenType == JsonTokenType.Null) { return default; } // 非null时使用默认的字符串枚举转换器逻辑 return JsonSerializer.Deserialize<TEnum>(ref reader, options); } public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }
步骤2:注册转换器
在AddJsonOptions中添加自定义转换器:
services.AddControllers().AddJsonOptions(x => { x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); // 注册自定义转换器,替换默认的枚举处理逻辑 x.JsonSerializerOptions.Converters.Add(new NullSafeEnumConverter<OrderStatus>()); x.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
如果需要全局处理所有枚举类型,可以借助反射实现通用注册逻辑,但针对特定枚举单独注册更高效。
内容的提问来源于stack exchange,提问作者shivam-sharma
相关产品推荐
相关产品推荐

