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

