JSON Schema 校验器

根据 JSON Schema 定义校验 JSON 数据。所有处理在浏览器中完成。

数据校验 错误报告 客户端处理

如何使用 JSON Schema 校验器

1

输入 Schema

在左侧输入 JSON Schema 定义。

2

输入数据

在右侧输入要校验的 JSON 数据。

3

校验

点击校验按钮查看结果。

什么是 JSON Schema?

JSON Schema 是一种用于描述和校验 JSON 数据结构的规范。它定义了 JSON 文档应满足的约束条件,包括字段类型、必填字段、值范围和格式要求。

核心特性

类型校验

支持 string、number、integer、boolean、array、object 和 null

约束条件

支持 minimum/maximum、minLength/maxLength、pattern、enum 等

结构定义

支持 required、properties、items、additionalProperties 等

常见问题

支持哪个版本的 JSON Schema?

支持 JSON Schema Draft-07 规范,这是目前最广泛使用的版本。

可以校验嵌套的 JSON 吗?

可以。JSON Schema 支持任意深度的嵌套对象和数组校验。

校验在浏览器中进行吗?

是的,所有校验完全在浏览器中使用 Ajv 库完成,数据不会发送到服务器。

哪些 JSON Schema 关键字最常用?

type(string、number、object、array、boolean、null)、包含嵌套 schema 的 properties、列出必填键的 required、用于固定取值集合的 enum、以正则约束字符串的 pattern,以及范围检查 minimum/maximum 和 minLength/maxLength。additionalProperties: false 可以收紧对象、禁止多余的键。它们共同覆盖了大部分 API 校验规则。

date-time 和 email 这类 format 关键字的行为是怎样的?

在现代 JSON Schema 中,format 默认只是注解(annotation),而不是自动断言——校验器只有在被配置为强制执行时才会检查它,2020-12 规范通过单独的 format-assertion 词汇表明确了这一点。如果必须保证强制校验,请使用 pattern 或自定义关键字;否则可将 format 视为互操作性元数据。

$ref 是什么?schema 复用是如何工作的?

指向 #/$defs/address 的 $ref 会引用 $defs 下的某个 schema 片段,并在所有使用到它的地方按该片段进行校验——这就是去重机制。Draft 2020-12 将旧的 definitions 重命名为 $defs,并正式引入 $dynamicRef 以支持评论树等递归结构。引用也可以指向外部文档,不过更常见的做法是本地打包。

oneOf、anyOf 和 allOf 有什么区别?

allOf 要求每个子 schema 都通过校验——即交集,用于在基础 schema 上组合附加约束。anyOf 要求至少一个通过——即并集,用于多态数据载荷。oneOf 要求恰好一个通过;两个或零个子 schema 通过校验都会失败,这比人们预期的更严格,也是 schema 相互重叠时出现意外错误的常见原因。

draft-07 和 2020-12 之间有哪些变化?

2020-12 将规范拆分为可独立协商的词汇表(validation、annotation、format-assertion),将 definitions 重命名为 $defs,把 exclusiveMinimum 简化为普通数字,并用 prefixItems 加 items 取代了旧的 items 关键字。大多数工具两种草案都支持;draft-07 仍是部署最广泛的版本,但 2020-12 是当前已发布的标准。

{-- * External Resources Component(#18 Phase 3b 内容佐证工程) * 工具页「权威引用」区块:RFC / W3C / WHATWG / ECMA / IANA / 官方规范站 / Wikipedia。 * * - 接受 :slug 属性 → 经 config/tool-sources.php 家族矩阵渲染该工具的权威引用 * - slug 未命中映射时不渲染(无权威来源的工具静默跳过) * - 链接 title 保持英文(引用源专名);description 经 * common.resources.descriptions.{key} 本地化,lang 未命中回退英文(线上不裸奔) * - 链接保持 dofollow(rel="noopener noreferrer") * * @param string|null $slug --}}