logo
GeekFormat

JSON Schema 校验

在线 JSON Schema 校验工具,支持 Draft 4 / 6 / 7 / 2019-09 / 2020-12 全部主流规范,毫秒级实时校验、JSON Pointer 精确错误定位、详细的字段级错误说明,并支持 $ref 引用解析、if/then/else 条件校验、anyOf/oneOf/allOf 组合逻辑等高级特性。无需注册、无需上传、完全在浏览器本地运行,数据永不离开您的设备。

相关推荐

适用场景

  • API 开发:验证后端返回的 JSON 响应是否符合 OpenAPI/Swagger 定义的 Schema
  • 前端表单校验:在提交前用 JSON Schema 校验用户输入数据的合法性
  • 配置文件校验:验证 JSON 格式的配置文件(如 package.json、tsconfig.json、CI 配置等)是否正确
  • 接口调试:对接第三方 API 时,验证请求体和响应体是否符合约定格式
  • 教学与学习:学习 JSON Schema 语法时的实验和验证工具,快速验证自己写的 Schema 是否正确
  • 测试用例编写:在自动化测试中先手动验证 Schema 规则的校验效果,再集成到测试代码中
  • 数据质量检查:ETL 过程中验证导入的 JSON 数据是否符合预期结构,提前发现脏数据
  • 团队协作:前后端共同约定 Schema 后,用此工具验证双方的实现是否一致

功能特点

  • 全版本支持:完整支持 JSON Schema Draft 4/6/7/2019-09/2020-12 五个主流版本,自动检测 $schema 声明
  • 实时校验:输入即校验,毫秒级响应,无需点击按钮即可看到校验结果
  • 精确错误定位:使用 JSON Pointer 标准路径,精确定位到出错的具体字段,错误列表一键跳转
  • 详细错误说明:每个错误都包含友好的中文说明和触发原因,帮助快速理解和修复问题
  • 高级校验特性:支持 $ref 本地引用解析、if/then/else 条件校验、anyOf/oneOf/allOf 组合逻辑等高级特性
  • 多端适配:响应式设计,桌面端双栏布局,移动端自动切换单栏,支持分屏比例调整
  • 实用快捷操作:一键格式化/压缩/清空/复制,内置用户/商品/配置等多种示例模板快速加载
  • 隐私安全:所有校验完全在浏览器本地运行,JSON 数据和 Schema 不会上传到任何服务器
  • 关键字速查表:内置 JSON Schema 常用关键字速查表,分类整理 type/required/pattern/format 等关键字
  • 多规范差异对比:提供 Draft 4 到 Draft 2020-12 的版本差异对比表,帮助选择合适的规范版本

使用方法

  1. 输入或粘贴 Schema:在左侧 Schema 编辑器中输入您的 JSON Schema 定义,或点击「加载示例」快速加载预设模板
  2. 输入待校验数据:在右侧数据编辑器中输入需要校验的 JSON 数据(页面已默认加载示例供参考)
  3. 选择规范版本:在工具栏选择 Draft 版本(默认自动检测 Schema 中声明的 $schema 版本)
  4. 查看校验结果:自动实时校验,通过时显示绿色「校验通过」提示,失败时显示具体错误路径和原因
  5. 修复错误:点击错误列表中的条目可以快速定位到出错位置,根据错误提示修改后实时重新校验

常见问题

怎么用 JSON Schema 校验 JSON 数据?

首先在左侧编辑器编写您的 JSON Schema 规则(定义字段类型、必填项、值范围等),然后在右侧输入待校验的 JSON 数据,工具会自动实时执行校验并显示结果。校验通过会显示绿色成功提示,校验失败会列出所有错误及其 JSON Pointer 路径。页面默认加载了一个用户信息示例,您可以参考示例格式编写自己的 Schema。

JSON 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 关键字速查表」列出了所有常用关键字及示例。

anyOf、oneOf 和 allOf 有什么区别?

allOf 表示数据必须同时满足所有子schema(逻辑与,常用于schema继承扩展);anyOf 表示数据只要满足其中任意一个子schema即可通过(逻辑或,允许多个匹配);oneOf 表示数据必须满足且只能满足其中一个子schema(异或,刚好匹配一个)。例如一个字段既可以是字符串也可以是数字时用 anyOf,而认证类型只能选 bearer 或 basic 其中之一时用 oneOf。

支持 $ref 引用和共享定义吗?

支持。工具可以解析本地引用,包括 $ref: '#/$defs/xxx' 形式的定义复用(Draft 2019-09+ 用 $defs,旧版规范用 definitions),以及引用同一文件内其他路径的定义。您可以在 Schema 中通过 $defs 定义可复用的子结构,然后在多处引用。注意:出于安全考虑,外部远程引用(跨URL的$ref)暂不支持自动解析。

JSON Schema 校验和 JSON 格式化有什么区别?

JSON 格式化(也称JSON美化/JSON压缩)只改变 JSON 的排版缩进,让 JSON 更易读或更紧凑,不检查内容是否合法。而 JSON Schema 校验是根据您定义的规则(类型、范围、必填项等)来检查 JSON 数据内容是否符合预期,属于内容验证。JSON语法错误(如多余逗号、引号不匹配)是基础错误,Schema校验包含了语法检查,但远不止于此——它还检查业务规则层面的合法性。

支持哪些版本的 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开始的数字。

JSON Schema required 怎么用?

required 是一个字符串数组,放在对象层级的 schema 中,列出哪些属性是必填的。例如:"type": "object", "properties": { "id": {"type": "string"}, "name": {"type": "string"} }, "required": ["id", "name"] 表示 id 和 name 这两个字段必须存在。注意 required 是放在父对象层级,不是放在每个属性的 schema 内部——这是初学者最常犯的错误。

JSON Schema pattern 正则怎么写?

pattern 关键字用于字符串类型,值是一个正则表达式字符串(遵循 ECMA-262 正则语法),字符串必须匹配该正则才算通过。例如 "pattern": "^[a-zA-Z0-9_]{3,16}$" 用于校验用户名,"pattern": "^1[3-9]\\d{9}$" 用于校验中国大陆手机号。注意正则表达式不需要写前后斜杠 /,直接写正则内容即可,JSON 中反斜杠需要双写转义。

JSON Schema enum 和 const 有什么区别?

enum(枚举)接受一个值数组,数据必须是数组中的某一个值,例如 "enum": ["admin", "user", "guest"] 表示角色只能是这三个值之一。const(常量)接受一个固定值,数据必须严格等于这个值,例如 "const": "bearer" 表示认证类型只能是bearer。如果枚举只有一个值,可以用 const 替代,语义更明确。

JSON Schema additionalProperties 怎么用?

additionalProperties 用于控制对象是否允许 properties 中未定义的额外属性。设为 false 表示不允许任何额外属性(严格模式);设为 true 表示允许任意额外属性(默认行为);也可以设为一个 schema 对象,表示额外属性必须符合该 schema。例如 "additionalProperties": { "type": "string" } 表示所有额外字段的值都必须是字符串类型。API开发中通常建议设为 false,避免客户端传入未预期的字段。

JSON Schema if/then/else 条件校验怎么写?

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"] }

JSON Schema format 支持哪些格式?

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 校验 API 响应?

可以根据 API 文档(或 OpenAPI/Swagger 定义)编写对应的 JSON Schema,然后将实际的 API 响应 JSON 粘贴到数据区进行校验。通常需要定义响应的顶层结构(如 code/message/data 字段),data 中数组元素的具体结构,以及每个字段的类型和约束。可以使用 $defs 复用重复的数据结构(如用户信息、分页信息等)。

JSON Schema 错误怎么解读?

错误信息包含三部分:(1) 路径:JSON Pointer 指向出错的字段;(2) 关键字:是哪个校验关键字失败了(如 required、type、minimum、pattern等);(3) 消息:具体的失败原因。例如错误路径 /age,关键字 minimum,消息 "must be >= 0" 表示 age 字段的值小于0,不满足 minimum 约束。点击错误项可直接跳转到对应代码位置。

JSON Schema和TypeScript类型有什么区别?

TypeScript 类型只在编译时检查,运行时不存在,无法校验外部输入数据(如API请求体、用户输入)。JSON Schema 是运行时的数据校验,能校验具体的值范围、正则匹配、枚举值、必填项、数组长度等 TypeScript 无法表达的细粒度约束。实际项目中常两者结合:用 TypeScript 做静态类型检查,用 JSON Schema(或基于JSON Schema的校验库如Ajv/Zod)做运行时数据校验。也可以通过工具在 JSON Schema 和 TypeScript 类型之间互相转换。

什么是 JSON Schema 校验

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 关键字速查表

下表列出了 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。
thenif 条件成立时需要满足的 Schema。
elseif 条件不成立时需要满足的 Schema。
引用复用
$ref引用其他 Schema 定义,支持本地引用(#/$defs/xxx)和远程引用。
$defs定义可复用的子 Schema(Draft 2019-09+,旧版用 definitions)。
definitionsDraft 4-7 中用于定义可复用子 Schema 的关键字。
元信息
titleSchema 的标题说明(注解,不参与校验)。
descriptionSchema 的详细描述(注解,不参与校验)。
default默认值(注解,不参与校验)。
examples示例值数组(注解,不参与校验)。
$schema指定使用的 JSON Schema 规范版本。
依赖关系
dependentRequired属性依赖:某个属性存在时,要求其他属性也必须存在(Draft 2019-09+)。
dependenciesDraft 4-7 中的依赖关键字,兼具属性依赖和 Schema 依赖功能。

JSON Schema 各版本差异对比

JSON Schema 经历了多个 Draft 版本演进,Draft 7 是目前最广泛使用的版本,Draft 2020-12 是最新稳定版。

功能特性Draft 4Draft 6Draft 72019-092020-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 定义复用definitionsdefinitionsdefinitions$defs$defs
dependentRequired
prefixItems 元组校验数组形式数组形式数组形式数组形式prefixItems
unevaluatedProperties
$dynamicRef/$anchor✓ $recursiveRef✓ dynamicRef

Code Examples

JavaScript:使用 Ajv 库校验 JSON Schema

javascript

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('校验通过!');
}

Python:使用 jsonschema 库校验

python

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)}")

Authoritative References

Troubleshooting

Unexpected token / Unexpected end of JSON input(JSON语法错误)

检查是否有多余的逗号(特别是最后一个属性/元素后多了逗号)、引号是否配对、是否使用了单引号(JSON 必须用双引号)、括号是否匹配。可以先使用 JSON 格式化/修复工具检查语法,再进行 Schema 校验。

must have required property 'xxx'(缺少必填字段)

在 JSON 数据中添加 xxx 字段,或者如果该字段确实不是必填的,从 Schema 的 required 数组中移除该字段名。注意 required 数组是放在对象层级,不是在属性内部。

must be string/number/boolean/array/object(数据类型不匹配)

检查该字段的值类型是否与 Schema 中 type 指定的一致。常见错误:数字加了引号变成字符串、布尔值写成了 "true"/"false" 字符串、null 写成了 "null" 字符串。

must NOT have additional properties(存在未允许的额外属性)

要么删除数据中多出的字段,要么在 Schema 中将 additionalProperties 改为 true(允许额外属性),或者在 properties 中补充该字段的定义。API开发建议设为false保持严格模式。

must match pattern(字符串不满足正则表达式)

检查字符串格式是否符合 pattern 指定的正则规则。注意JSON中正则表达式的反斜杠需要双写(转义),例如 \d 在JSON中要写成 \\d。正则不需要写前后斜杠/。

must be equal to constant / must be equal to one of the allowed values(值不在枚举范围内)

检查字段值是否是 enum 数组中的值之一,或是否等于 const 指定的常量。注意大小写敏感,字符串要完全匹配。

must have at least/minimum/maximum N items(数组长度不符合约束)

检查数组元素个数是否满足 minItems/maxItems 限制。如果报 uniqueItems 错误,表示数组中有重复元素需要去重。

must be >= / <= / multipleOf(数值超出范围)

检查数值是否在 minimum/maximum 指定范围内,是否是 multipleOf 指定数值的倍数。注意边界值:exclusiveMinimum/exclusiveMaximum表示不包含边界值(严格大于/小于)。