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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:50:29