⭐ 觉得好用?收藏备用,下次直接打开
等待输入
JSON Schema
Schema:空
待校验数据
数据:空
校验结果
左侧输入 Schema,右侧输入数据

JSON Schema 校验器 把一份 Schema 和一份数据放左右两栏,实时告诉你数据哪里不符合约束。底层用 ajv —— JavaScript 生态最快、覆盖最全的 JSON Schema 引擎,支持 Draft 7 / 2019-09 / 2020-12 三个版本切换。

核心验证维度:

  • 类型type: string / number / integer / boolean / null / object / array
  • 结构requiredpropertiesadditionalPropertiespatternProperties
  • 值约束minLength / maxLength / minimum / maximum / exclusiveMinimum / pattern
  • 枚举与常量enumconst
  • 格式format: email / date / uri / uuid / ipv4 等(已加载 ajv-formats)
  • 组合allOfanyOfoneOfnot
  • 引用$ref 指向 #/$defs/X#/definitions/X(仅内部引用,不联网)

错误路径格式:采用 JSON Pointer(RFC 6901),/a/b/0/c 表示 data.a.b[0].c。每条错误含 keyword(触发规则)、path(数据位置)、message(原因)、schemaPath(Schema 位置,悬停可见)。

隐私与性能:所有运算在浏览器本地完成,Schema 和数据不会上传任何服务器;切换 Draft 会按需加载对应 ajv 子包,首次切换到 2019-09 / 2020-12 会有极短加载。

📍使用场景

  • 接口联调排错后端改了响应结构,粘一份 Schema 和示例数据,立刻定位哪条字段不符、哪条类型偏了。
  • 配置文件校验CI 之前本地先过一遍 Schema,不用等流水线跑完才发现 `config.yaml` 里少写一个必填项。
  • 生成 Mock 数据检查自动生成的假数据送到前端后"长得对不对",用 Schema 校一遍最直观。

常见问题

Draft 7 / 2019-09 / 2020-12 该选哪个?

先看 Schema 里 `$schema` 字段写的是哪个 URL,跟着选就对。新项目推荐 2020-12(引入 `prefixItems` 元组、`$dynamicRef` 等);OpenAPI 3.1 底层也是它。Draft 7 是过去几年最主流的版本,生态最广。选错 Draft 可能导致 `items` 数组、`$defs` 等写法解析不一致。

怎么看错误的 `path`?

错误列表里的路径是 JSON Pointer 格式,例如 `/user/age` 指向根对象 `user.age` 字段。数组用数字索引,如 `/items/0/name`。路径能一眼定位数据里的问题点;悬停 `path` 会显示 `schemaPath`(Schema 里产生该错误的位置),可以对照排查规则。

为什么 `required` 缺字段报在父对象上?

这是 ajv 的原生行为——缺字段错误的 `instancePath` 其实是父对象的路径,而非"不存在"字段的路径。本工具已把缺失字段名拼接到 path 尾部(显示为 `/user/email`),阅读起来和字段类型错误一致。

`additionalProperties: false` 为什么常常报错?

它表示 只允许 Schema 里列出的字段,多一个都不行。常用于严格 API 契约。如果你的 Schema 是从样本 JSON 推断来的,这个字段默认是 `true` 或缺省,所以不会挡;但手写 Schema 时误加了 `false` 会导致每个"额外"字段都报 `additionalProperties` 错。

format(email / date / uri)会校验吗?

会。本工具已经加载 ajv-formats 插件,覆盖 `date`、`time`、`date-time`、`email`、`hostname`、`ipv4`、`ipv6`、`uri`、`uuid` 等常见 format。如果 Schema 只写 `"format": "email"` 没有配格式校验插件,ajv 默认是静默通过的;本工具强制开启,所以格式错会真的报出来。

数据可以引用外部 Schema(`$ref` 网址)吗?

不可以。本工具 不会发起外部网络请求,所有数据和 Schema 都在浏览器本地处理。`$ref` 只能指向 Schema 内部的 `#/$defs/X` 或 `#/definitions/X`。要合并多份 Schema,请先本地合并再粘进来。