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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:21