.NET 6升级后Newtonsoft JSON空值处理配置问题
.NET 6中Newtonsoft.Json反序列化单独配置NullValueHandling的方案
要实现反序列化时忽略空属性,序列化(响应输出)时保留空属性的效果,无需全局统一设置NullValueHandling,可以通过以下两种方式分开配置:
方法一:全局层面拆分输入/输出配置
在Program.cs中配置Newtonsoft.Json时,分别调整输入格式化器(负责反序列化)和输出格式化器(负责序列化)的设置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 全局设置序列化(响应输出)时保留空属性(默认即为Include,可显式声明) options.SerializerSettings.NullValueHandling = NullValueHandling.Include; // 找到Newtonsoft的输入格式化器,单独修改反序列化设置 var inputFormatter = options.InputFormatters.OfType<NewtonsoftJsonInputFormatter>().FirstOrDefault(); if (inputFormatter != null) { // 复制全局配置并修改反序列化的NullValueHandling var deserializationSettings = inputFormatter.SerializerSettings.Clone(); deserializationSettings.NullValueHandling = NullValueHandling.Ignore; inputFormatter.SerializerSettings = deserializationSettings; } });
这种方式能一次性全局生效,既解决模型绑定时空值传入的问题,又保证响应JSON保留空属性。
方法二:针对单个模型/属性局部配置
如果仅需对特定模型或属性调整行为,可以直接在模型类上使用JsonProperty特性单独指定反序列化的规则,序列化时继承全局默认的保留空属性设置:
public class YourModel { // 反序列化时忽略空值,序列化时保留该属性(即使为空) [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string? RequiredProperty { get; set; } // 其他属性继承全局设置 public string? OptionalProperty { get; set; } }
这种方式灵活性更高,适合仅需局部调整的场景。
内容的提问来源于stack exchange,提问作者user3083835
相关产品推荐
相关产品推荐

