JSON Schema生成器 在线生成Schema工具
从示例JSON数据自动生成JSON Schema(draft-07),支持类型推断、格式检测和嵌套结构,适合接口文档、数据校验和代码生成。
更新于 2026-08-16
相关工具
功能特性
- 实时从任意 JSON 文档生成 JSON Schema(draft-07):粘贴 JSON 即刻得到 schema
- 推断全部六种 JSON 类型:string、number、integer、boolean、null、array、object
- 必填项开关:所有属性标记为必填,或生成全可选 schema 用于部分更新
- additionalProperties 开关:决定校验器是否拒绝对象中未声明的键
- 常见格式检测:ISO 日期时间、日期、邮箱与 http(s) 链接自动转为 format 关键字
- 数组元素类型混合时生成 anyOf items,而不是强行统一为单一类型
- 深层嵌套结构完整递归:嵌套对象、对象数组、数组的数组都支持
- 整数与小数区分:42 推断为 integer,42.5 推断为 number
- 缩进可选 2 或 4 空格
- 严格 JSON 校验,输入格式错误时精确定位行列
- 拖拽 .json 文件或使用文件选择器加载样本数据
- 将 schema 保存为 .json 文件,或复制用于 ajv、OpenAPI 规范与 TypeScript 代码生成器
使用方法
- 1把 JSON 样本粘贴到左侧面板,schema 立即出现在右侧,无需点击转换按钮。
- 2从 User Profile 示例开始,看格式检测效果:邮箱、日期时间和 URI 字段都带上了 format 关键字。
- 3试试 Product Catalog 示例,看产品数组如何变成带对象 items 定义的数组 schema。
- 4在 Required 的 All 与 Optional 之间切换,控制属性是否全部进入 required 列表。
- 5在 Additional properties 的 Forbid 与 Allow 之间切换,控制校验时是否拒绝额外键。
- 6关闭 Format detection 可得到不含 format 关键字的 schema,例如你的字符串其实不是邮箱或日期时。
- 7在 Indent 中选择 2 或 4 空格,匹配项目已有 schema 的风格。
- 8输入无效时用左侧红色行号定位,错误面板会显示信息与位置。
- 9点击复制图标,把 schema 粘贴进 ajv、CI 校验步骤或 OpenAPI 的 components/schemas 区块。
- 10将输出保存为 schema.json,与 API 契约放在一起备查。
常见问题
什么是 JSON Schema?
JSON Schema 是一种基于 JSON 的格式,用于描述 JSON 数据的结构:对象有哪些键、值是什么类型、哪些字段必填、有什么约束。校验器(如 ajv)用它检查传入数据是否符合契约,代码生成器用它生成 TypeScript 类型或 OpenAPI 定义。
为什么生成的 JSON Schema 和我的预期不一样?
因为生成器只能推断样本 JSON 中实际出现的内容,数据里没有的键不会出现在 schema 中,样本未体现的约束(如最小/最大值、枚举、正则)也无法推断。生成器递归遍历 JSON 文档,把每个值映射为类型:对象变为 properties 映射、数组变为 items schema、字符串保持字符串。请把输出当作起点而非最终契约,关键约束需手动补充。
生成的是哪个 JSON Schema 草案?
输出面向 draft-07,这是兼容性最广的版本,ajv(v6/v8)、OpenAPI 3.0 与大多数代码生成器都支持。如果需要更新的草案(如 2020-12),这里生成的关键字在 draft-07 校验器下依然有效。
为什么生成的 schema 里 required 是空的?
因为 Required 选项处于 Optional,它生成完全没有 required 列表的 schema,适用于同一对象类型用于部分更新(PATCH 请求)的场景。切换到 'All',样本中出现的每个属性都会加入 required 数组。注意推断基于样本:JSON 中不存在的键根本不会出现在 schema 里。
为什么 integer 和 number 是分开的类型?
在 JSON Schema 中,integer 是比 number 更严格的类型。样本值 42 生成 { "type": "integer" },42.5 生成 { "type": "number" }。这对校验器很重要:integer 类型的 schema 会拒绝 42.5。如果 API 接受小数,请手动把类型改为 number。
为什么混合类型的数组生成的是 anyOf?
因为生成器会对元素类型去重并输出 anyOf items。例如 [1, "a", true] 生成 items: { anyOf: [{ "type": "integer" }, { "type": "string" }, { "type": "boolean" }] }。强行统一为单一类型会让校验器拒绝合法的元素。如果所有元素类型相同,items 就是该单一类型 schema。
为什么空数组生成的 schema 什么约束都没有?
因为空数组 [] 没有可推断的类型信息,所以生成 { "type": "array", "items": {} },接受任意元素。空对象同理:{} 生成 { "type": "object", "properties": {} }。两者都是合法的 draft-07 schema,但不含任何约束,请在了解真实数据结构后补充完善。
生成器会检测日期、邮箱这类格式吗?
会,开启 Format detection 时生效。匹配 ISO 日期时间(2025-07-01T08:30:00Z)、日期(2025-07-01)、邮箱(name@example.com)或 http(s) URI 模式的字符串会带 format 关键字。注意 format 只是提示,多数校验器需要启用 format 选项才会强制执行,且正则有意保持简单。
为什么 schema 不包含 enum、min 或 max 等约束?
因为这些约束无法从单个样本可靠推断,值为 3 并不能证明最小值是 3,而样本中的值也不是完整合法值集合,基于样本生成 enum 会让校验器拒绝样本中恰好没出现的合法值。生成器只输出类型层面的结构;请为校验关键字段手动补充 minimum、maximum、pattern、enum 等关键字。
为什么我的 JSON 校验失败,提示有未定义的属性?
因为生成的 schema 默认 additionalProperties: false,校验器会拒绝 properties 中未声明的任何键,拼写错误和意外的 API 字段会大声失败而非悄悄通过。需要宽松校验或对象动态增长时,把 Additional properties 选项切换为 Allow 即可。
生成的 schema 可以用于 ajv 或 OpenAPI 吗?
可以。输出是纯 draft-07 JSON,可直接用于 ajv(new Ajv().validate(schema, data))、OpenAPI 3.0 的 components/schemas 区块,或用 json-schema-to-typescript 生成 TypeScript 接口。使用前记得检查生成的 required 与 additionalProperties 设置。
生成器能处理非常大的 JSON 文件吗?
可以:典型 API 响应与配置文件即时完成。超大文档(10 MB+)可能让浏览器变慢,因为推断会在本地递归整棵树。schema-first 项目建议手写 schema,用样本数据去校验它。
Python、Java、C# 里怎么生成 JSON Schema?
Python:pip install genson,然后 Genson().add_object(data).to_schema()。Java:用 json-schema-generator 库(everit/snowgum 分支)可以从样本 JSON 或 POJO 生成 draft-07 schema。C#:用 NJsonSchema,JsonSchema.FromJsonAsync(json) 或 FromType。这些库输出的都是 draft-07 或兼容格式;本工具零配置就能得到同样结果。
能用 npm 包或 VS Code 生成 JSON Schema 吗?
可以。npm 上 typescript-json-schema 从 TypeScript 接口生成 schema(类型驱动的更严格方向),genson-js 从样本 JSON 生成。VS Code 没有内置生成器,安装 quicktype 等扩展(还能生成 TypeScript 和 C#),或者直接把 JSON 粘贴到本工具复制结果。
JSON Schema 和 JSON 数据有什么区别?
JSON 数据是实际的信息(用户记录、API 响应)。JSON Schema 是对数据形状的描述:它的类型、键与约束。schema 本身也是用 JSON 写的,所以可以被 JSON 解析器校验,并由同一套工具链处理。
能从生成的 schema 生成 TypeScript 类型吗?
本工具只输出 JSON Schema。把结果复制到 json-schema-to-typescript 或 quicktype 等代码生成器即可得到 TypeScript 接口,或放入 OpenAPI 的 components/schemas 生成类型化客户端。这些工具都接受 draft-07 输出。
这个工具能生成 mock 或假数据吗?
不能,本工具的方向是数据 → schema。生成器从 JSON 推断 schema,但无法从 schema 产生样本数据。需要假数据请使用专门的 mock 工具或 faker 等库,或把生成的 schema 喂给 schema 驱动的数据生成器。