Newtonsoft.Json中NullValueHandling=Ignore不生效问题求助
Newtonsoft.Json反序列化Required与NullValueHandling冲突问题
问题场景
使用C#结合Newtonsoft.Json 13.0.2版本执行反序列化:
var car = JsonConvert.DeserializeObject<Car>(resp);
对应的JSON内容:
{ "perf": { "perfRef": null, "perfTest": { "value": 1.2, "unit": "percent" } } }
perf类定义:
public partial class perf { [Newtonsoft.Json.JsonProperty("perfRef", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public PerfRef perfRef { get; set; } [Newtonsoft.Json.JsonProperty("perfTest", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public PerfTest perfTest { get; set; } }
执行后持续抛出异常:
Newtonsoft.Json.JsonSerializationException: Required property 'perfRef' expects a non-null value. Path 'perf'
原因分析
你确实误解了这两个特性的作用,它们是独立职责,不存在互相覆盖的逻辑:
Required = Required.DisallowNull:核心是强制属性值不能为null——无论JSON中是否包含该字段,只要反序列化后属性最终为null,就触发异常。你的JSON里明确传递了"perfRef": null,直接命中这个校验规则。NullValueHandling.Ignore:作用范围是序列化时忽略null属性不写入JSON,或者反序列化时若JSON中不存在该字段则跳过赋值。它既管不了JSON里明确写了null的情况,也不会绕过Required的校验规则。
解决方案
方案1:调整Required规则(最直接)
将Required.DisallowNull改为Required.AllowNull或Required.Default,允许属性接受null值:
[Newtonsoft.Json.JsonProperty("perfRef", Required = Newtonsoft.Json.Required.AllowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public PerfRef perfRef { get; set; }
方案2:业务层面规避
如果业务要求perfRef不能为null,但JSON可能传入null,可通过以下方式处理:
- 在
perf类的构造函数中初始化perfRef为默认实例:public perf() { perfRef = new PerfRef(); } - 反序列化前预处理JSON,移除
"perfRef": null节点。
方案3:自定义ContractResolver(复杂场景)
通过自定义ContractResolver修改校验逻辑,但仅适用于特殊定制需求,一般前两种方案即可满足需求。
内容的提问来源于stack exchange,提问作者sinDizzy
相关产品推荐
相关产品推荐

