Newtonsoft.Json 没有 JsonIgnoreCondition 枚举,该枚举属于 System.Text.Json;混用命名空间会导致编译错误或配置失效,Newtonsoft 中应使用 NullValueHandling.Ignore 实现类似功能。

直接说结论:Newtonsoft.Json 没有 JsonIgnoreCondition 这个枚举,那是 System.Text.Json 的东西;用 Newtonsoft 时别混用命名空间,否则编译不通过或行为异常。
Newtonsoft.Json 里根本没有 JsonIgnoreCondition
你在查资料时看到的 JsonIgnoreCondition(比如 JsonIgnoreCondition.WhenWritingNull)属于 .NET Core 3.0+ 内置的 System.Text.Json,和 Newtonsoft.Json 完全无关。两者 API 不互通,类型不能混用。
常见错误现象:
- 写了
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]却发现编译报错 —— 因为这个属性在Newtonsoft.Json命名空间下根本不存在 - 引用了
System.Text.Json的命名空间但实际项目还在用JsonConvert.SerializeObject—— 配置完全不生效
确认你用的是哪个库,看 using 语句:
-
using Newtonsoft.Json;→ 用NullValueHandling.Ignore -
using System.Text.Json;→ 才能用JsonIgnoreCondition
Newtonsoft.Json 忽略 null 的两种有效方式
所有生效方式都围绕 NullValueHandling.Ignore,它只控制「序列化」(即对象 → JSON 字符串),对反序列化无影响。
推荐按优先级使用:
-
全局设置最省事:每次调用
JsonConvert.SerializeObject都传JsonSerializerSettings - 属性级控制更灵活:仅对某几个字段忽略 null,不影响其他逻辑
示例:
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
string json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);或者单字段标注:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string NickName { get; set; }注意:NullValueHandling.Ignore 对可空类型(如 int?、DateTime?)值为 null 同样生效;但它不会跳过默认值(如 int 的 0、bool 的 false),那是 DefaultValueHandling 干的事。
System.Text.Json 怎么配 JsonIgnoreCondition
如果你已迁移到 System.Text.Json(比如 ASP.NET Core 默认序列化器),那才轮到 JsonIgnoreCondition 上场。
类级别写法:
[JsonObject(IncludeFields = false)]
public class User
{
public string Name { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Email { get; set; }
}或者全局配置(如在 Startup.cs 或 Program.cs):
services.AddControllers()
.AddJsonOptions(opt => {
opt.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});注意:System.Text.Json 的 WhenWritingNull 和 Newtonsoft 的 NullValueHandling.Ignore 行为基本一致,但前者不支持运行时动态切换策略(比如不同接口用不同规则),后者可通过传入不同 JsonSerializerSettings 实现。
容易被忽略的反序列化陷阱
很多人以为「忽略 null」是双向的,其实不是:所有上述配置都只作用于序列化。反序列化时遇到 "field": null,仍会把 null 写进目标属性(哪怕它是可空类型),覆盖掉原有值。
如果你需要「反序列化时跳过 null 字段,保留原值」,Newtonsoft 没有内置开关,得手动处理:
- 用
JObject.Parse(json)先解析成动态结构,再逐字段判断是否缺失或为null - .NET 7+ 可用
JsonSerializerOptions.PropertyNamingPolicy配合自定义转换器,但成本高 - 更现实的做法:把字段声明为可空类型(
string?、int?),并在业务层做空值保护
例如:
public class Order
{
public int Id { get; set; }
public string? Status { get; set; } // 反序列化后为 null 是明确信号,而非“未设置”
}真正复杂的点不在怎么写配置,而在于:你得清楚当前项目用的是哪个 JSON 库、配置作用域在哪一层、以及反序列化时 null 到底算“未提供”还是“显式清空”。


















