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

ASP.NET Core迁移至System.Text.Json:可空引用类型序列化{}转null修复方法

解决System.Text.Json序列化DBNull为{}的问题

要让System.Text.Json把DBNull序列化为null,和Newtonsoft.Json行为一致,需要自定义转换器并配置到序列化选项中,具体步骤如下:

1. 实现自定义DBNull转换器

创建一个继承自JsonConverter<object>的转换器,在序列化时判断值是否为DBNull,若是则输出null;反序列化时也可处理null转为DBNull,对齐原Newtonsoft行为:

public class DBNullConverter : JsonConverter<object>
{
    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Null)
        {
            return DBNull.Value;
        }
        return JsonSerializer.Deserialize(ref reader, typeToConvert, options);
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        if (value == DBNull.Value)
        {
            writer.WriteNullValue();
            return;
        }
        JsonSerializer.Serialize(writer, value, options);
    }
}

2. 配置System.Text.Json使用该转换器

替换原项目中的AddNewtonsoftJson()配置,改为配置System.Text.Json并添加自定义转换器:

.NET 6+(Top-level statements)

builder.Services.AddMvc()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DBNullConverter());
        // 可选:如需对齐Newtonsoft其他行为,可添加以下配置
        // options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        // options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
    });

旧版本Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new DBNullConverter());
        });
}

3. 验证效果

配置完成后,原本被序列化为{}的DBNull值会输出为null,和Newtonsoft.Json的行为完全一致,此时即可完全移除Newtonsoft.Json相关包与配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:47:08