System.Text.Json导致IActionResult HttpGet请求中可空属性丢失的原因?
可空整数属性序列化后消失的原因与解决方法
核心原因
System.Text.Json和Newtonsoft.Json的默认序列化行为存在关键差异:.NET 6中,System.Text.Json默认会忽略值为null的可空值类型属性,而Newtonsoft.Json默认会将这类null值属性序列化输出。你设置的IncludeFields是控制字段序列化的开关,和属性无关,因此不会对这个问题产生影响。
解决办法
有两种方式可以让null值的可空整数属性被正常序列化:
1. 全局配置(推荐)
在Program.cs里配置Json序列化选项,修改默认的忽略规则:
builder.Services.AddControllers() .AddJsonOptions(options => { // 所有null值属性都保留,不忽略 options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.Never; // 或者更精准:只忽略非可空值类型的默认值(比如int的0),可空类型的null仍保留 // options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault; });
注意:WhenWritingDefault更贴合多数业务场景,它会过滤掉非可空值类型的无意义默认值,但保留可空类型的null;Never则会保留所有null值属性,包括引用类型的null。
2. 属性单独配置
如果只需要针对某个特定属性生效,可以在属性上添加特性:
[JsonIgnore(Condition = JsonIgnoreCondition.Never)] public int? MyNullableIntProperty { get; set; }
额外排查点
确认你的属性是public访问修饰符,System.Text.Json默认只会序列化public属性——不过你提到后端运行正常,这个大概率不是问题,但可以快速确认下。
内容的提问来源于stack exchange,提问作者slastine
相关产品推荐
相关产品推荐

