📐 JSON Schema 验证
使用 JSON Schema 验证 JSON。显示错误时包含位置信息,包括类型不匹配、缺失必需属性、enum 外的值和正则表达式违反。支持 Draft 7、2019-09 和 2020-12。
完全免费
无需注册
浏览器内完成
5 种语言
深色模式
结果将显示在这里。
🔗 相关工具
📖 常见的坑
用 Ajv 8 执行 JSON Schema(Draft 7 / 2019-09 / 2020-12),把类型不符、缺少必填项、超出 enum 等问题连同字段路径一并列出。处理全部在浏览器内完成。「0 个错误」并不等于「数据正确」——schema 一松,什么都能过。人们在 JSON Schema 上栽跟头的原因,几乎都集中于「以为写下的约束其实并未生效」。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 写了 format: email,无效地址却照样通过 | format 默认只是注解,并不做校验。这不是实现偷懒,而是 JSON Schema 规范本身如此:format 断言被定义为「可选词汇」,实现可以忽略它而仍然自称合规。Ajv 也一样——除非另行加载 ajv-formats,否则 email、date-time、uri、uuid 全部直接放行。棘手之处在于,写 schema 的人以为在校验,运行时却全放行,直到上线才被发现。 |
服务端务必加上 ajv-formats——两行:const addFormats = require("ajv-formats"); addFormats(ajv);。若更看重可移植性,用 pattern 写正则更稳妥,在任何实现里结果都一致。(邮箱地址的完整正则并不现实,写到 ^[^@\s]+@[^@\s]+\.[^@\s]+$ 即可,真实性交给确认邮件去验证。)若要把 schema 交给他人,请注明是否以「校验 format」为前提——这一点一旦默认省略,校验的严格程度就取决于对方用的是哪个实现。 |
| 写了 required,缺字段却依然通过 | 绝大多数是位置放错了。required 应直接写在对象 schema 之下,值为键名数组:{"type":"object","properties":{...},"required":["id","name"]}。把 "required": true 写在 properties 里面是 Draft 3 的写法,当前的 Draft 只会把它当作未知关键字直接忽略——连错误都不报,所以你无从察觉。同理,拼错的 requred 或 minLenght 也会被静默忽略。 |
请以 strict: true 运行 Ajv。它会把未知关键字与矛盾的类型声明报为错误,从而把所有「悄无声息不起作用」的约束都揪出来。同时,请为 schema 本身写测试,关键在于至少包含一份「必须被拒绝」的数据,而不只是「应当通过」的数据——只有后者的测试,即使 schema 是空的也照样全绿。嵌套对象的必填项要写在该对象自己的 schema 里;父级的 required 管不到子级的键。 |
| 写了 additionalProperties: false,多余的键还是能过 | 一旦与 allOf 或 $ref 组合,它就失效了。原因是 additionalProperties 只看写在同一个 schema 对象里的 properties。用 allOf 继承基础 schema 并在子级写 additionalProperties: false,连基础里定义的属性都会被算作「额外属性」,导致完全合法的数据被整批拒绝。反过来写在基础上,子级新增的属性又会被挡。这是 JSON Schema 中最烧时间的地方,只要用了 schema 继承,几乎必踩。 |
2019-09 及以后,请使用 unevaluatedProperties: false。它会先扣除已被 allOf 与 $ref 评估过的属性再作判定,因此能与继承共存——这个关键字正是为解决该问题而加入的。若必须停留在 Draft 7,不如放弃继承,在打包时把 schema 拍平成单份文档,反而更快。另外,API 的输入校验是否应当拒绝未知键,是一个设计决策:拒绝会牺牲前向兼容,只是新增一个字段就会打断所有既有客户端。「输入从严、输出从宽」(Postel 原则)是稳妥的默认。 |
请老老实实写上 $schema。省略它,实现就会替你挑一个默认 draft,于是同一份 schema 在不同环境里含义不同。Draft 7 与 2020-12 在数组关键字上差别尤为明显:元组(各位置类型不同的数组)的写法从 items 的数组形式改到了 prefixItems,把 Draft 7 的元组写法喂给 2020-12 的实现,会把第一个类型套用到数组的所有元素上——不报错,只是含义悄悄变了。还有一点:不要仅因为「校验通过」就信任数据。JSON Schema 保证的是形状,「这个 ID 是否真实存在」「金额与明细合计是否一致」这类业务一致性不在其职责范围内。Schema 校验是门口的过滤器,不能替代领域校验。
📖 使用方法
-
1
输入 JSON Schema在左侧粘贴 JSON Schema。
-
2
输入要验证的 JSON 数据在右侧粘贴要验证的 JSON 数据。
-
3
查看验证结果并修复如有错误,将显示字段路径、消息和参数。
❓ 常见问题
支持哪些 Draft 版本?
使用 Ajv 8,支持 Draft 7、2019-09、2020-12。
format 验证(email、date 等)有效吗?
此工具默认将 format 视为注释。严格验证需要 ajv-formats 等扩展。
什么是 JSON Schema?
JSON Schema 是描述 JSON 数据结构和约束的规范。
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
✅
感谢您的反馈!
已送达运营者,将用于改进工具。