JSON Schema 校验器
JSON用 JSON Schema(Draft-07 / 2019-09 / 2020-12)校验 JSON 并逐字段报告违规,或从样例反推 Schema。
不获取远程 URL;请直接粘贴你的 JSON。
本页内容
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 会被容忍运行,而不是直接被拒。
怎么用#
- 从工具栏的开关里选一个模式:
- Validate(默认):左侧贴 schema,右侧贴数据。
- Infer:左侧贴一份示例 JSON,右侧读自动生成的 schema。
- 在 Validate 模式下,选择 schema 所依据的草案——Draft-07 覆盖了绝大多数现存 schema;只有当你的 schema 用了 2019-09 或 2020-12 才引入的特性时,才需要选后两者。
- 选择输出的缩进——2 或 4 空格。Infer 模式下它决定生成 schema 的排版。
- 右栏根据模式显示数据文档(Validate)或推导出的 schema(Infer),栏标签会随之切换。
- Validate 模式下,两栏下方的违例面板逐条列出违规,形如
路径 —— 原因。文档根级显示为(root),嵌套字段则显示为它的 JSON Pointer,比如/age。 - 点右栏的 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 都以它为目标,你大概率需要的(type、properties、required、minimum、format、$ref)它都支持。只有当你的 schema 明确用了后两个草案才引入的特性时——比如 unevaluatedProperties 或修订后的 $ref 行为——才需要升级。选错草案通常也能跑,但最稳妥的做法是按 schema 作者的本意来选。
为什么违例提示是英文的?#
因为那是 Ajv 对每个关键字给出的原始原因文案(must have required property、must be >= 0 等等),原样透传、未作翻译。这样做的目的是保持一致:这些字符串和你服务端校验记进日志的完全相同,一旦线上对不上,拿这里的文案直接 grep 就能定位。
“放宽 strict 模式”是什么意思?#
Ajv 的 strict 模式会拒绝它认为潦草的 schema——未知关键字、无法解析的 $ref、缺少 type。这在构建流水线里有用,但对一个校验工具来说是错的——它的本职是拿你给的任何 schema 去检查数据。本页关掉了 strict 模式,所以不严谨的 schema 会编译并运行,而不是抛错。
能先推导再拿去校验吗?#
可以——这正是推荐的闭环用法。在 Infer 模式贴入一份有代表性的样本,复制生成的 schema,切到 Validate,把这份 schema 贴回左栏。推导出的 schema 会干净地重新校验原始样本,之后你就可以用它检查每一份新文档。