JSON Schema 校验器
最后更新:2026年10月2日
用 JSON Schema 校验 JSON 文档,并列出每一处未通过的约束及其路径。文档和 Schema 都在你的浏览器中解析与检查。
它检查什么
JSON Schema 描述一份文档允许具有的形状:有哪些属性、各自是什么类型、取值范围和模式如何。本页用一个 Schema 检查一份文档,并列出每一处不满足的位置,每条都带路径,方便你定位。
支持的关键字包括:type、const、enum、required、properties、additionalProperties、minProperties、maxProperties、items(单个 Schema,或 Schema 元组)、minItems、maxItems、uniqueItems、minLength、maxLength、pattern、minimum、maximum、exclusiveMinimum、exclusiveMaximum、multipleOf、allOf、anyOf、oneOf、not,以及指向同一 Schema 内部的本地 $ref 指针。
它有意不做的事
- 不解析远程
$ref。只解析同一 Schema 内部的指针(#/$defs/…、#/definitions/…)。去取另一个文件意味着发出网络请求,而这正是本工具要避免的。 format不作为断言。在较新的草案中format只是注解,不被强制,这里也如此处理——email格式不会拒绝格式错误的地址。- 部分关键字未实现:
patternProperties、unevaluatedProperties、if/then/else、dependentSchemas、contains。使用它们的 Schema 仍会检查其他关键字,但未实现的关键字不会被强制执行——所以不要把这里的「通过」当作基于它们构建的 Schema 的完整一致性结果。 - 不对 Schema 做元校验。语法上是有效 JSON、但逻辑有误的 Schema 可能只是匹配不到任何内容;本页检查的是文档,而不是 Schema 自身的正确性。
如何阅读错误
每处失败都报告在一个路径上:$ 是文档根,点号进入属性,方括号索引数组。required 报告在「本应包含该属性的对象」上——约束在对象上,而不在缺失的属性上——消息里会指明属性名。anyOf 和 oneOf 只在失败的那个实例上报告一次,而不是每个分支一次;满屏的分支错误反而会淹没真正的问题。
常见问题
支持哪些 JSON Schema 关键字?
type、const、enum、required、properties、additionalProperties、minProperties、maxProperties、items(单个 Schema 或 Schema 元组)、minItems、maxItems、uniqueItems、minLength、maxLength、pattern、minimum、maximum、exclusiveMinimum、exclusiveMaximum、multipleOf、allOf、anyOf、oneOf、not,以及本地 $ref。
有意不支持的有什么?
远程 $ref(只解析同一 Schema 内部的指针)、作为断言的 format 关键字、patternProperties、unevaluatedProperties、if/then/else 和 dependentSchemas。使用这些关键字的 Schema 仍会校验上面列出的关键字;未实现的关键字不会被强制执行,因此不要把这里的「通过」当作基于它们构建的 Schema 的完整一致性结果。
校验是在服务器上进行的吗?
不是。文档和 Schema 都在你的浏览器中用 JSON.parse 解析,并在内存中检查。不会上传任何内容,断开网络后页面依然可用。
为什么「缺少必需属性」的错误报告在父路径上?
因为约束就在那里。JSON Schema 把 required 应用于对象,而不是缺失的那个属性,所以错误报告在对象的路径上——例如 $ 而不是 $.name——并在消息里指明属性名。
anyOf 和 oneOf 是如何报告的?
在失败的那个实例上报告一条错误,而不是每个分支一条。anyOf 在没有任何分支匹配时失败;oneOf 在匹配的分支数不等于一时失败,消息会说明匹配了几个。把每个分支内部的错误都列出来反而会淹没真正的问题。
它会告诉我 Schema 本身有错,还是只检查文档?
它用 Schema 检查文档。如果 Schema 本身不是有效的 JSON,会单独告知。它不会用 JSON Schema 元 Schema 校验你的 Schema,因此语法正确但逻辑有误的 Schema 可能只是匹配不到任何内容。