在数据处理和接口校验场景中,我们经常会遇到需要判断一个对象不是全空的需求,也就是要求对象中至少有一个属性的值不为null。JSON Schema作为常用的数据校验规范,本身没有直接提供非全空校验的关键字,但可以通过组合现有关键字来实现这个效果。

实现核心思路
要实现对象非全空校验,核心是利用JSON Schema的not关键字和required关键字组合。首先定义对象所有属性都允许为null,然后通过not关键字排除所有属性都为null的情况,这样剩下的就是至少有一个属性非null的合法对象。
基础实现方案
假设我们有一个用户对象,包含name、age、email三个可选属性,要求这三个属性不能同时为null,基础校验规则如下:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": { "type": ["string", "null"] },
"age": { "type": ["integer", "null"] },
"email": { "type": ["string", "null"] }
},
"not": {
"required": ["name", "age", "email"],
"properties": {
"name": { "type": "null" },
"age": { "type": "null" },
"email": { "type": "null" }
}
}
}
上面的规则中,not部分的逻辑是:当name、age、email三个属性都存在且值都为null时,校验不通过。只要有一个属性的值不是null,就不会命中not里的条件,校验通过。
适配更多场景的优化方案
如果对象的属性数量不固定,或者后续会新增属性,上面的硬编码属性名的方式就不太灵活,我们可以使用patternProperties关键字来匹配所有属性,实现通用的非全空校验:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"patternProperties": {
".*": { "type": ["string", "integer", "boolean", "array", "object", "null"] }
},
"not": {
"patternProperties": {
".*": { "type": "null" }
}
}
}
这个规则中,patternProperties的.*会匹配对象的所有属性,not部分的逻辑是:如果所有属性的值都是null,就校验不通过,否则校验通过,不需要提前知道对象的具体属性名。
校验效果测试
我们可以用几个不同的对象来测试上面的通用规则:
- 全空对象
{"name": null, "age": null, "email": null}:校验不通过 - 部分为空对象
{"name": "张三", "age": null, "email": null}:校验通过 - 无属性对象
{}:校验通过,因为没有属性可以判定为全空 - 包含非null属性对象
{"age": 20}:校验通过
注意事项
需要注意JSON Schema的版本差异,部分旧版本(比如draft-04)不支持patternProperties和not的组合用法,建议使用draft-07及以上版本。另外如果对象允许空对象(也就是没有任何属性)的情况,不需要额外处理,上面的规则已经兼容。如果要求对象至少有一个属性且非全空,可以额外添加minProperties: 1的限制。
JSON_Schema对象校验非全空校验null校验修改时间:2026-06-10 19:36:26