导读:本期聚焦于小伙伴创作的《如何用JSON Schema实现对象非全空校验确保至少一个属性非null》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用JSON Schema实现对象非全空校验确保至少一个属性非null》有用,将其分享出去将是对创作者最好的鼓励。

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

如何用JSON Schema实现对象非全空校验确保至少一个属性非null

实现核心思路

要实现对象非全空校验,核心是利用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)不支持patternPropertiesnot的组合用法,建议使用draft-07及以上版本。另外如果对象允许空对象(也就是没有任何属性)的情况,不需要额外处理,上面的规则已经兼容。如果要求对象至少有一个属性且非全空,可以额外添加minProperties: 1的限制。

JSON_Schema对象校验非全空校验null校验修改时间:2026-06-10 19:36:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。