JSON Schema 校验
在线 JSON Schema 校验工具,支持 Draft 4 / 6 / 7 / 2019-09 / 2020-12 全部主流规范,毫秒级实时校验、JSON Pointer 精确错误定位、详细的字段级错误说明,并支持 $ref 引用解析、if/then/else 条件校验、anyOf/oneOf/allOf 组合逻辑等高级特性。无需注册、无需上传、完全在浏览器本地运行,数据永不离开您的设备。
在线 JSON Schema 校验工具,支持 Draft 4 / 6 / 7 / 2019-09 / 2020-12 全部主流规范,毫秒级实时校验、JSON Pointer 精确错误定位、详细的字段级错误说明,并支持 $ref 引用解析、if/then/else 条件校验、anyOf/oneOf/allOf 组合逻辑等高级特性。无需注册、无需上传、完全在浏览器本地运行,数据永不离开您的设备。
首先在左侧编辑器编写您的 JSON Schema 规则(定义字段类型、必填项、值范围等),然后在右侧输入待校验的 JSON 数据,工具会自动实时执行校验并显示结果。校验通过会显示绿色成功提示,校验失败会列出所有错误及其 JSON Pointer 路径。页面默认加载了一个用户信息示例,您可以参考示例格式编写自己的 Schema。
JSON Schema 支持丰富的校验规则:类型校验(type)、必填字段(required)、枚举值(enum/const)、字符串长度和正则匹配(minLength/maxLength/pattern)、数值范围(minimum/maximum/multipleOf)、语义格式(format: email/uri/date-time/uuid/ipv4等)、数组长度和元素约束(minItems/maxItems/uniqueItems/items)、对象属性约束(properties/additionalProperties/propertyNames)、逻辑组合(allOf/anyOf/oneOf/not)、条件校验(if/then/else)以及引用复用($ref/$defs)等。本页面下方的「JSON Schema 关键字速查表」列出了所有常用关键字及示例。
allOf 表示数据必须同时满足所有子schema(逻辑与,常用于schema继承扩展);anyOf 表示数据只要满足其中任意一个子schema即可通过(逻辑或,允许多个匹配);oneOf 表示数据必须满足且只能满足其中一个子schema(异或,刚好匹配一个)。例如一个字段既可以是字符串也可以是数字时用 anyOf,而认证类型只能选 bearer 或 basic 其中之一时用 oneOf。
支持。工具可以解析本地引用,包括 $ref: '#/$defs/xxx' 形式的定义复用(Draft 2019-09+ 用 $defs,旧版规范用 definitions),以及引用同一文件内其他路径的定义。您可以在 Schema 中通过 $defs 定义可复用的子结构,然后在多处引用。注意:出于安全考虑,外部远程引用(跨URL的$ref)暂不支持自动解析。
JSON 格式化(也称JSON美化/JSON压缩)只改变 JSON 的排版缩进,让 JSON 更易读或更紧凑,不检查内容是否合法。而 JSON Schema 校验是根据您定义的规则(类型、范围、必填项等)来检查 JSON 数据内容是否符合预期,属于内容验证。JSON语法错误(如多余逗号、引号不匹配)是基础错误,Schema校验包含了语法检查,但远不止于此——它还检查业务规则层面的合法性。
工具支持 JSON Schema Draft 4、Draft 6、Draft 7、Draft 2019-09 和 Draft 2020-12 全部五个主流版本。默认会根据您 Schema 中的 $schema 字段自动检测版本,您也可以在工具栏手动切换版本进行测试。Draft 7 是目前最广泛使用的版本,Draft 2020-12 是最新稳定版。本页面下方的「版本差异对比表」列出了各版本的功能区别。
可以。每个校验错误都会提供标准的 JSON Pointer 路径(如 /user/address/city 或 /items/0/name),精确指示出错的字段位置。在错误列表中点击某条错误,编辑器会自动滚动并定位到对应位置。JSON Pointer 使用 RFC 6901 标准,斜杠分隔路径段,数组索引用从0开始的数字。
required 是一个字符串数组,放在对象层级的 schema 中,列出哪些属性是必填的。例如:"type": "object", "properties": { "id": {"type": "string"}, "name": {"type": "string"} }, "required": ["id", "name"] 表示 id 和 name 这两个字段必须存在。注意 required 是放在父对象层级,不是放在每个属性的 schema 内部——这是初学者最常犯的错误。
pattern 关键字用于字符串类型,值是一个正则表达式字符串(遵循 ECMA-262 正则语法),字符串必须匹配该正则才算通过。例如 "pattern": "^[a-zA-Z0-9_]{3,16}$" 用于校验用户名,"pattern": "^1[3-9]\\d{9}$" 用于校验中国大陆手机号。注意正则表达式不需要写前后斜杠 /,直接写正则内容即可,JSON 中反斜杠需要双写转义。
enum(枚举)接受一个值数组,数据必须是数组中的某一个值,例如 "enum": ["admin", "user", "guest"] 表示角色只能是这三个值之一。const(常量)接受一个固定值,数据必须严格等于这个值,例如 "const": "bearer" 表示认证类型只能是bearer。如果枚举只有一个值,可以用 const 替代,语义更明确。
additionalProperties 用于控制对象是否允许 properties 中未定义的额外属性。设为 false 表示不允许任何额外属性(严格模式);设为 true 表示允许任意额外属性(默认行为);也可以设为一个 schema 对象,表示额外属性必须符合该 schema。例如 "additionalProperties": { "type": "string" } 表示所有额外字段的值都必须是字符串类型。API开发中通常建议设为 false,避免客户端传入未预期的字段。
if/then/else 实现条件校验:当数据满足 if 中的 schema 时,还必须满足 then 中的 schema;否则必须满足 else 中的 schema(else可选)。典型场景:例如当 type 字段为 "business" 时,要求提供 businessLicense 字段;当 type 为 "personal" 时不要求。示例:"if": { "properties": { "type": { "const": "business" } }, "required": ["type"] }, "then": { "required": ["businessLicense"] }
format 关键字提供语义格式校验,常用值包括:date-time(ISO 8601日期时间)、date(日期YYYY-MM-DD)、time(时间HH:MM:SS)、email(邮箱地址)、uri(URI/URL)、uuid(UUID)、ipv4/ipv6(IP地址)、hostname(主机名)、regex(正则表达式)等。注意:在 Draft 2019-09 及之后版本中,format 默认只作为注解不强制校验,本工具默认启用 format 校验。
可以根据 API 文档(或 OpenAPI/Swagger 定义)编写对应的 JSON Schema,然后将实际的 API 响应 JSON 粘贴到数据区进行校验。通常需要定义响应的顶层结构(如 code/message/data 字段),data 中数组元素的具体结构,以及每个字段的类型和约束。可以使用 $defs 复用重复的数据结构(如用户信息、分页信息等)。
错误信息包含三部分:(1) 路径:JSON Pointer 指向出错的字段;(2) 关键字:是哪个校验关键字失败了(如 required、type、minimum、pattern等);(3) 消息:具体的失败原因。例如错误路径 /age,关键字 minimum,消息 "must be >= 0" 表示 age 字段的值小于0,不满足 minimum 约束。点击错误项可直接跳转到对应代码位置。
TypeScript 类型只在编译时检查,运行时不存在,无法校验外部输入数据(如API请求体、用户输入)。JSON Schema 是运行时的数据校验,能校验具体的值范围、正则匹配、枚举值、必填项、数组长度等 TypeScript 无法表达的细粒度约束。实际项目中常两者结合:用 TypeScript 做静态类型检查,用 JSON Schema(或基于JSON Schema的校验库如Ajv/Zod)做运行时数据校验。也可以通过工具在 JSON Schema 和 TypeScript 类型之间互相转换。
JSON Schema 校验是一种通过声明式规则来验证 JSON 数据结构和内容是否符合预期的技术。JSON Schema 本身是一个用 JSON 编写的规范文档,它定义了 JSON 数据应该长什么样:有哪些字段、字段是什么类型、值的范围是什么、哪些字段是必填的、是否允许额外属性等。
在前后端分离开发、API 设计、配置文件校验、数据质量保证等场景中,JSON Schema 校验是必不可少的工具。它能在数据进入系统前提前拦截不合法的数据,避免因数据格式错误导致的程序异常。配合本工具,您可以快速验证 Schema 定义是否正确、测试 JSON 数据是否符合预期、在开发阶段就发现数据问题。
JSON Pointer 是错误报告中使用的路径定位语法,采用 RFC 6901 标准格式,以斜杠分隔路径段。例如路径 /user/address/city 表示根对象的 user 属性下的 address 对象下的 city 字段。路径中的数组元素使用从 0 开始的数字下标,如 /items/2/name 表示数组 items 的第 3 个元素(索引为2)的 name 字段。特殊字符(如 ~ 和 /)会分别被转义为 ~0 和 ~1。理解 JSON Pointer 路径可以帮助您快速定位到出错的具体字段位置。
本工具支持所有主流 JSON Schema 版本,从最经典的 Draft 4 到最新的 Draft 2020-12,自动检测您的 Schema 中声明的 $schema 版本,也允许手动切换版本进行测试。页面下方的「JSON Schema 关键字速查表」分类列出了所有常用校验关键字及其用法示例,「版本差异对比表」则帮助您了解各版本之间的功能区别。
JSON Schema format 关键字提供语义格式校验,常用值包括:date-time(ISO 8601日期时间)、date(日期YYYY-MM-DD)、time(时间HH:MM:SS)、email(邮箱地址)、uri(URI/URL)、uuid(UUID)、ipv4/ipv6(IP地址)、hostname(主机名)、regex(正则表达式)。注意在 Draft 2019-09 及之后版本中,format 默认只作为注解不强制校验,本工具默认启用 format 校验。
下表列出了 JSON Schema 规范中最常用的校验关键字,按功能分类整理,方便快速查阅。
| 关键字 | 说明 |
|---|---|
| 基础类型 | |
type | 指定数据类型:string、number、integer、boolean、array、object、null。支持单类型或类型数组。 |
| 对象校验 | |
properties | 定义对象各属性的子 Schema。 |
required | 字符串数组,指定哪些属性是必填的。 |
additionalProperties | 控制是否允许未在 properties 中定义的额外属性,可设为 false 或一个 Schema。 |
propertyNames | 约束属性名必须匹配的 Schema(通常用 pattern 正则)。 |
minProperties | 对象最少包含的属性数量。 |
maxProperties | 对象最多包含的属性数量。 |
| 枚举常量 | |
enum | 枚举值数组,数据必须是数组中的某一个值。 |
const | 常量值,数据必须严格等于该值。 |
| 数值约束 | |
minimum | 数值最小值(包含边界)。 |
maximum | 数值最大值(包含边界)。 |
exclusiveMinimum | 数值严格大于(不包含边界)。 |
exclusiveMaximum | 数值严格小于(不包含边界)。 |
multipleOf | 数值必须是指定数的倍数。 |
| 字符串约束 | |
minLength | 字符串最小长度。 |
maxLength | 字符串最大长度。 |
pattern | 正则表达式,字符串必须匹配该模式。 |
format | 语义格式校验:email、uri、date-time、uuid、ipv4、ipv6、hostname 等。 |
| 数组约束 | |
items | 定义数组元素的 Schema(单 Schema 适用于所有元素)。 |
minItems | 数组最少元素个数。 |
maxItems | 数组最多元素个数。 |
uniqueItems | 数组元素是否必须唯一。 |
contains | 数组中至少有一个元素匹配该 Schema。 |
| 组合逻辑 | |
allOf | 数据必须匹配所有子 Schema(逻辑与)。 |
anyOf | 数据至少匹配一个子 Schema(逻辑或)。 |
oneOf | 数据必须恰好匹配一个子 Schema(异或)。 |
not | 数据必须不匹配该 Schema(逻辑非)。 |
| 条件校验 | |
if | 条件判断 Schema,数据匹配 if 时需满足 then,否则需满足 else。 |
then | if 条件成立时需要满足的 Schema。 |
else | if 条件不成立时需要满足的 Schema。 |
| 引用复用 | |
$ref | 引用其他 Schema 定义,支持本地引用(#/$defs/xxx)和远程引用。 |
$defs | 定义可复用的子 Schema(Draft 2019-09+,旧版用 definitions)。 |
definitions | Draft 4-7 中用于定义可复用子 Schema 的关键字。 |
| 元信息 | |
title | Schema 的标题说明(注解,不参与校验)。 |
description | Schema 的详细描述(注解,不参与校验)。 |
default | 默认值(注解,不参与校验)。 |
examples | 示例值数组(注解,不参与校验)。 |
$schema | 指定使用的 JSON Schema 规范版本。 |
| 依赖关系 | |
dependentRequired | 属性依赖:某个属性存在时,要求其他属性也必须存在(Draft 2019-09+)。 |
dependencies | Draft 4-7 中的依赖关键字,兼具属性依赖和 Schema 依赖功能。 |
JSON Schema 经历了多个 Draft 版本演进,Draft 7 是目前最广泛使用的版本,Draft 2020-12 是最新稳定版。
| 功能特性 | Draft 4 | Draft 6 | Draft 7 | 2019-09 | 2020-12 |
|---|---|---|---|---|---|
| type 类型校验 | ✓ | ✓ | ✓ | ✓ | ✓ |
| required 必填字段 | ✓ | ✓ | ✓ | ✓ | ✓ |
| enum/const 常量 | ✓ enum | ✓ | ✓ | ✓ | ✓ |
| minimum/maximum 数值范围 | ✓ | ✓ | ✓ | ✓ | ✓ |
| exclusiveMinimum/Maximum | 布尔值 | 数值 | 数值 | 数值 | 数值 |
| multipleOf 倍数校验 | ✓ | ✓ | ✓ | ✓ | ✓ |
| minLength/maxLength | ✓ | ✓ | ✓ | ✓ | ✓ |
| pattern 正则匹配 | ✓ | ✓ | ✓ | ✓ | ✓ |
| format 格式校验 | ✓ | ✓ | ✓ | 默认注解 | 默认注解 |
| items 数组校验 | ✓ | ✓ | ✓ | ✓ | ✓ |
| contains 包含元素 | ✗ | ✓ | ✓ | ✓ | ✓ |
| minItems/maxItems | ✓ | ✓ | ✓ | ✓ | ✓ |
| uniqueItems | ✓ | ✓ | ✓ | ✓ | ✓ |
| additionalProperties | ✓ | ✓ | ✓ | ✓ | ✓ |
| propertyNames | ✗ | ✓ | ✓ | ✓ | ✓ |
| allOf/anyOf/oneOf/not | ✓ | ✓ | ✓ | ✓ | ✓ |
| if/then/else 条件 | ✗ | ✗ | ✓ | ✓ | ✓ |
| $ref 引用 | ✓ | ✓ | ✓ | ✓ | ✓ |
| $defs 定义复用 | definitions | definitions | definitions | $defs | $defs |
| dependentRequired | ✗ | ✗ | ✗ | ✓ | ✓ |
| prefixItems 元组校验 | 数组形式 | 数组形式 | 数组形式 | 数组形式 | prefixItems |
| unevaluatedProperties | ✗ | ✗ | ✗ | ✓ | ✓ |
| $dynamicRef/$anchor | ✗ | ✗ | ✗ | ✓ $recursiveRef | ✓ dynamicRef |
Ajv (Another JSON Schema Validator) 是 JavaScript 生态中最流行、性能最好的 JSON Schema 校验库,支持 Draft 04/06/07/2019-09/2020-12 全部版本。
// 安装: npm install ajv
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true });
// 定义 Schema
const schema = {
type: 'object',
required: ['name', 'email'],
properties: {
name: { type: 'string', minLength: 1 },
email: { type: 'string', format: 'email' },
age: { type: 'integer', minimum: 0 }
},
additionalProperties: false
};
// 编译校验函数
const validate = ajv.compile(schema);
// 校验数据
const data = { name: '张三', email: 'zhangsan@example.com', age: 25 };
const valid = validate(data);
if (!valid) {
console.log('校验失败:', validate.errors);
} else {
console.log('校验通过!');
}jsonschema 是 Python 生态中最常用的 JSON Schema 校验库,可通过 pip 安装使用。
# 安装: pip install jsonschema
import jsonschema
from jsonschema import validate
# 定义 Schema
schema = {
"type": "object",
"required": ["name", "email"],
"properties": {
"name": {"type": "string", "minLength": 1},
"email": {"type": "string", "format": "email"},
"age": {"type": "integer", "minimum": 0}
},
"additionalProperties": False
}
# 待校验数据
data = {"name": "张三", "email": "zhangsan@example.com", "age": 25}
try:
validate(instance=data, schema=schema)
print("校验通过!")
except jsonschema.exceptions.ValidationError as e:
print(f"校验失败: {e.message}")
print(f"错误路径: {list(e.absolute_path)}")检查是否有多余的逗号(特别是最后一个属性/元素后多了逗号)、引号是否配对、是否使用了单引号(JSON 必须用双引号)、括号是否匹配。可以先使用 JSON 格式化/修复工具检查语法,再进行 Schema 校验。
在 JSON 数据中添加 xxx 字段,或者如果该字段确实不是必填的,从 Schema 的 required 数组中移除该字段名。注意 required 数组是放在对象层级,不是在属性内部。
检查该字段的值类型是否与 Schema 中 type 指定的一致。常见错误:数字加了引号变成字符串、布尔值写成了 "true"/"false" 字符串、null 写成了 "null" 字符串。
要么删除数据中多出的字段,要么在 Schema 中将 additionalProperties 改为 true(允许额外属性),或者在 properties 中补充该字段的定义。API开发建议设为false保持严格模式。
检查字符串格式是否符合 pattern 指定的正则规则。注意JSON中正则表达式的反斜杠需要双写(转义),例如 \d 在JSON中要写成 \\d。正则不需要写前后斜杠/。
检查字段值是否是 enum 数组中的值之一,或是否等于 const 指定的常量。注意大小写敏感,字符串要完全匹配。
检查数组元素个数是否满足 minItems/maxItems 限制。如果报 uniqueItems 错误,表示数组中有重复元素需要去重。
检查数值是否在 minimum/maximum 指定范围内,是否是 multipleOf 指定数值的倍数。注意边界值:exclusiveMinimum/exclusiveMaximum表示不包含边界值(严格大于/小于)。