工具
指南

JSON Schema 校验器

JSON

用 JSON Schema(Draft-07 / 2019-09 / 2020-12)校验 JSON 并逐字段报告违规,或从样例反推 Schema。

100% 客户端 无后端

不获取远程 URL;请直接粘贴你的 JSON。

Schema
数据
输入 Schema 与数据(校验)或样例(反推)。
本页内容

JSON Schema 工具是什么?#

一个 JSON 值本身只能告诉你数据”是什么”——这里是字符串、那里是数字;它没法告诉你数据”应该是什么”:age 是不是必须是非负整数、email 是不是必填、tags 能不能为空数组。JSON Schema 就是用来表达这些约束的词汇表。你写一份 schema——一个描述数据形状的小型 JSON 文档——校验器就会逐字段地检查某份数据是否符合这个形状。

本页用一套 schema 引擎做两件事。校验(Validate) 接收一份 schema 和一份数据文档,告诉你究竟哪些字段违反了哪条规则,每一条都标到它在文档里的路径。推导(Infer) 反过来走:给它一份示例 JSON,它会替你写出一个 Draft-07 风格的 schema——遍历整棵结构,记录每个字段的类型。两者天然可以衔接:先从一份有代表性的样本推导出 schema,再用它校验以后每一份文档。

校验跑在和线上代码同样的 Ajv 引擎上,可选三种草案(Draft-07、2019-09、2020-12),并放宽了 strict 模式的限制,所以略微不严谨的 schema 会被容忍运行,而不是直接被拒。

怎么用#

  1. 从工具栏的开关里选一个模式
    • Validate(默认):左侧贴 schema,右侧贴数据。
    • Infer:左侧贴一份示例 JSON,右侧读自动生成的 schema。
  2. Validate 模式下,选择 schema 所依据的草案——Draft-07 覆盖了绝大多数现存 schema;只有当你的 schema 用了 2019-09 或 2020-12 才引入的特性时,才需要选后两者。
  3. 选择输出的缩进——2 或 4 空格。Infer 模式下它决定生成 schema 的排版。
  4. 右栏根据模式显示数据文档(Validate)或推导出的 schema(Infer),栏标签会随之切换。
  5. Validate 模式下,两栏下方的违例面板逐条列出违规,形如 路径 —— 原因。文档根级显示为 (root),嵌套字段则显示为它的 JSON Pointer,比如 /age
  6. 点右栏的 Copy 取走推导出的 schema 或数据;Sample / Clear 用于载入示例或重置。

只要两边都能解析,结果立刻算出。schema 或数据的语法错误会给出精确行列号,并标注是 schema、data 还是 compile 类问题,让你清楚该去哪儿查。

主要特性#

  • 一个引擎,两种模式。 用同一套可信的校验器既校验文档、又从样本生成 schema。
  • 三种草案。 Draft-07、2019-09、2020-12 各自只加载自己那份编译后的校验器,你始终是在针对真正想要的草案做校验。
  • 报全所有错误。 每条违例都会被收集,所以一份有五个问题的文档会一次显示五条,而不是逼你来回跑五趟。
  • 违例带路径。 每条违规都指向它在文档里的位置——文档级问题显示 (root),精确字段则是指针,比如 /user/address/zip
  • 放宽 strict 模式。 含未知关键字或缺顶层 type 的 schema 会被容忍运行,而不是在编译期被拒——一个以”检查”为本职的工具就该这样,而不是反过来教训你。
  • 纯本地处理。 schema 和数据都在浏览器里处理,不上传任何东西。

真实示例#

一个 user 对象必须有 name,且 age 必须是非负整数。在 Validate 模式下把这份 schema 贴到左栏:

{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 0 }
  },
  "required": ["name"]
}

再测一份两条规则都违反的数据——缺 name,且 age 为负:

{
  "age": -3
}

违例面板会报出两条违规,每条都标到事发位置:

(root) — must have required property 'name'
/age   — must be >= 0

(root) 这条路径告诉你缺的是文档级的必填属性;/age 直接指向出问题的字段。把数据改成 {"name":"ada","age":36},状态就会翻成 valid、违例列表为空。原因文案用的是 Ajv 自己的关键字措辞,原样保留——这和你线上日志里会看到的一模一样。

常见问题#

Draft-07、2019-09、2020-12 该选哪个?#

Draft-07 是务实的默认选择:教程、库、OpenAPI 规范里绝大多数 schema 都以它为目标,你大概率需要的(typepropertiesrequiredminimumformat$ref)它都支持。只有当你的 schema 明确用了后两个草案才引入的特性时——比如 unevaluatedProperties 或修订后的 $ref 行为——才需要升级。选错草案通常也能跑,但最稳妥的做法是按 schema 作者的本意来选。

为什么违例提示是英文的?#

因为那是 Ajv 对每个关键字给出的原始原因文案(must have required propertymust be >= 0 等等),原样透传、未作翻译。这样做的目的是保持一致:这些字符串和你服务端校验记进日志的完全相同,一旦线上对不上,拿这里的文案直接 grep 就能定位。

“放宽 strict 模式”是什么意思?#

Ajv 的 strict 模式会拒绝它认为潦草的 schema——未知关键字、无法解析的 $ref、缺少 type。这在构建流水线里有用,但对一个校验工具来说是错的——它的本职是拿你给的任何 schema 去检查数据。本页关掉了 strict 模式,所以不严谨的 schema 会编译并运行,而不是抛错。

能先推导再拿去校验吗?#

可以——这正是推荐的闭环用法。在 Infer 模式贴入一份有代表性的样本,复制生成的 schema,切到 Validate,把这份 schema 贴回左栏。推导出的 schema 会干净地重新校验原始样本,之后你就可以用它检查每一份新文档。