在线 JSON Schema 生成器:从 JSON 数据自动生成 Schema 定义
什么是 JSON Schema
JSON Schema 是一个用于描述和验证 JSON 数据结构的标准。它定义了 JSON 对象的属性、类型、约束和默认值。把样例数据贴进我们的 JSON Schema 生成器,即可自动生成可直接使用的 Schema。
示例 JSON Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1 },
"age": { "type": "integer", "minimum": 0 },
"email": { "type": "string", "format": "email" },
"tags": { "type": "array", "items": { "type": "string" } }
},
"required": ["name", "email"]
}
为什么需要 JSON Schema
- API 文档:自动生成 API 请求/响应的结构文档
- 数据验证:在运行时验证 JSON 数据的正确性(JSON Schema 编辑器可以在浏览器里边写边校验)
- 表单生成:基于 Schema 自动生成表单 UI
- Mock 数据:根据 Schema 生成测试数据
- 类型安全:为 TypeScript 接口生成类型定义
- 配置验证:验证配置文件的格式是否正确
JSON Schema 核心关键字
| 关键字 | 说明 | 示例 |
|---|---|---|
type | 数据类型 | "string", "number", "boolean", "array", "object" |
properties | 对象属性 | { "name": { "type": "string" } } |
required | 必填字段 | ["name", "email"] |
minimum/maximum | 数值范围 | "minimum": 0, "maximum": 100 |
minLength/maxLength | 字符串长度 | "minLength": 1, "maxLength": 255 |
enum | 枚举值 | ["active", "inactive", "pending"] |
format | 格式验证 | "email", "uri", "date-time" |
items | 数组元素类型 | { "type": "string" } |
如何使用在线工具
使用 ToolVault 工具匣 的 JSON Schema 生成器:
- 粘贴一个 JSON 对象示例
- 按需开启选项:勾选「推断 format」让 email、date-time、uri、uuid、IP 地址等样本值自动产出
"format"注解;「规范版本」可切换$schema声明为 draft-07 或 2020-12 - 点击生成,工具分析数据结构(嵌套对象、数组元素、可空字段都会正确处理)
- 一键复制 Schema 代码,再按契约手工收紧 required / enum / pattern
从 JSON 示例自动生成
输入
{
"id": 1,
"name": "张三",
"email": "zhang@example.com",
"isActive": true,
"tags": ["developer", "admin"],
"address": {
"city": "上海",
"zip": "200000"
}
}
输出 Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"email": { "type": "string" },
"isActive": { "type": "boolean" },
"tags": { "type": "array", "items": { "type": "string" } },
"address": {
"type": "object",
"properties": {
"city": { "type": "string" },
"zip": { "type": "string" }
}
}
}
}
代码中的 JSON Schema 验证
JavaScript(Ajv)
const Ajv = require('ajv');
const ajv = new Ajv();
const schema = {
type: 'object',
properties: {
name: { type: 'string', minLength: 1 },
age: { type: 'integer', minimum: 0 }
},
required: ['name']
};
const validate = ajv.compile(schema);
const valid = validate({ name: '张三', age: 28 });
console.log(valid); // true
Python
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"name": {"type": "string", "minLength": 1},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name"]
}
try:
validate(instance={"name": "张三", "age": 28}, schema=schema)
print("验证通过")
except ValidationError as e:
print(f"验证失败: {e.message}")
单样本推断的先天局限
从单个样本生成的 schema 是「描述」不是「约束」——它记录了看到的(所有字段必填、类型按观察、无边界),漏掉了变异的一切(那天恰好不在的可选字段、字符串格式、数值范围、枚举里只有一个值时的枚举)。生成纪律:喂多样本(三个差异大的样本胜过一个完美样本);把推断结果当草稿(一小时的收紧——类型加边界、真可选字段标记——把描述变成契约);有任何真实源头(TypeScript 类型、OpenAPI、数据库 DDL)就从源头生成而不是从数据考古。单样本 schema 直接上线是「用今天的数据建的闸门挡今天的数据」——测试全过的假信心机器。
draft 版本:改变输出的生成器设置
draft 选择器(draft-04 / draft-07 / 2019-09 / 2020-12)不是装饰:exclusiveMinimum 在 draft-04 是布尔修饰符、draft-07+ 变数值;definitions 在 2019-09 改名 $defs;$ref 语义在 2019-09 与相邻关键字分离(draft-07 忽略兄弟关键字,之后处理)。给现代验证器生成 draft-04 输出 = 静默验证错误或加载失败。选择规则:配你将运行的验证器(Ajv 8 默认 2020-12、Python jsonschema 历史默认 draft-07),在工具链配置里锁定版本而非接受 latest——draft 升级是 schema 语义的破坏性变更,不是工具小更新。
Schema 演进:不破坏消费者的版本化
Schema 会变、消费者代码不会同步更新。值得记住的兼容性规则:加可选字段是向后兼容(旧数据过新 schema)但向前兼容需要 additionalProperties 允许未知字段(生产中最被忽视的开关);收窄类型(string 变 string+enum)向后兼容但破坏向前;删除和改名双向破坏。运维模式:把 schema 文件当 API 对待——版本化、兼容性 CI(每次变更用旧样本对新 schema 验证)、跨发布边界先废弃再删除。等消费者拒收周二的某条数据时才「发现」不兼容,就是这套纪律要防的事故。
生成器能提示的 format(以及仍需人手的部分)
开启 推断 format 后,看起来像邮箱、URI、UUID、IPv4/IPv6 或日期时间的样例字符串会带上 "format" 注解。这是文档与部分校验库的提示,不保证每个消费库行为一致。数值边界、enum、required 几乎总要人工过一遍:一份样例无法知道明天的可选字段,也无法知道状态码的封闭列表。
生成后,把 Schema 贴进 JSON Schema 校验器,再用第二份故意不同的载荷(缺可选键、多未知字段、边界数字)试一遍。若样例与对抗载荷都「轻松通过」,说明 Schema 仍是描述,还不是契约。
FAQ
JSON Schema 支持哪些版本?
当前常用的是 Draft 7(2018-02)和 2020-12。Draft 7 在库兼容面上更稳妥;若校验器与 $defs / $ref 兄弟规则已按 2020-12 约定,再选该草案。把 draft 钉在工具链配置里,而不是追「最新」。
Schema 和 TypeScript 接口可以互转吗?
可以。使用 typescript-json-schema 从 TS 生成 Schema,或使用 json-schema-to-typescript 从 Schema 生成 TS 接口。工具可自动化这个过程。
JSON Schema 能验证嵌套对象吗?
可以。JSON Schema 天然支持嵌套对象定义,使用递归的 properties 描述深层结构。也支持 $ref 关键字引用已定义的子 Schema,避免重复定义。
排查注记
「单样本推断的先天局限」放在教程正文之后,因为它才是生成的本质边界:单样本 schema 是「描述」不是「约束」,直接上线就是「用今天的数据建的闸门挡今天的数据」——测试全过的假信心机器。生成纪律因此给得很具体:三个差异大的样本胜过一个完美样本;有 TypeScript、OpenAPI、DDL 这类真实源头就从源头生成、不做数据考古。draft 一节把版本差异列成破坏性变更(exclusiveMinimum 从布尔变数值、definitions 改名 $defs),结论是版本锁进工具链配置、别追最新;验收标准同样直白——样例和对抗载荷都轻松通过,说明 Schema 仍是描述、还不是契约。
本文由 ToolVault 工具匣 提供。更多免费本地工具见 首页。
相关工具
相关文章
在线 CSV 转 SQL 工具:将表格数据导入数据库
CSV 转 INSERT:空单元格→NULL、MySQL 反引号或 PostgreSQL 双引号、BOM 剥离、Markdown 竖线转义,以及与 COPY/LOAD 的分工。
HTML 表格转 JSON 怎么保留行列结构?
把网页里的 HTML 表格转成 JSON,怎么保留表头、处理合并单元格、保持嵌套结构?逐步方法并附本站 HTML 表格转 JSON 工具。
Excel 转 JSON 后日期变成数字 / 中文乱码,怎么办?
把 Excel 转成 JSON 时日期变 44927 这种数字、中文乱码、空单元格丢失怎么办?讲清 Excel 日期序列号与编码坑,并附本站 Excel 转 JSON 工具。