JSON Schema 生成器,免费

粘贴 JSON 即可自动生成 JSON Schema。

没有数据离开您的设备

使用方法

  1. 在输入区粘贴 JSON 对象或数组。
  2. 启用选项:包含 required 数组或根据您的值生成 examples
  3. 点击生成 Schema 以创建 JSON Schema(Draft 2020-12)。
  4. 复制下载生成的 Schema。

常见问题

生成的是哪个版本的 JSON Schema?

生成器产出 JSON Schema Draft 2020-12(https://json-schema.org/draft/2020-12/schema),这是最新的稳定草案。

它能处理嵌套对象和数组吗?

可以。生成器会递归处理嵌套的对象和数组。对于数组,它根据第一个元素推断 schema。

可以编辑生成的 Schema 吗?

输出是一个起点。您可能需要根据需求添加约束,如 minLengthminimumpatternenum

JSON Schema 用来做什么

JSON Schema 是用一种声明式的方法来描述一份 JSON 文档应该长成什么样子:它有哪些属性、这些属性持什么类型、什么是必需的还是可选的、什么值是合法的。它在 JSON 世界里相当于 XML 的 XSD,或者一个数据库表定义。官方项目在 json-schema.org

你会在以下场合遇到它:

你在野外会看到的 draft

JSON Schema 的规范以一系列 draft 形式发布。当前稳定 draft 是 2020-12(根据官方 spec 页面:「The current version is 2020-12」)。你可能遇到的 draft:

拿不准时,选与你的验证器匹配的 draft。AJV(最流行的 JavaScript 验证器)显式 opt-in 后支持 Drafts 04、06、07、2019-09 和 2020-12。Python 的 jsonschema 也是。如果你不知道下游消费者想要什么,2020-12 是新工作的安全默认。

内置类型

JSON Schema 描述了与 JSON 值种类对应的七个基本类型:

类型JSON 值常用关键字
string"hello"minLengthmaxLengthpatternformat
number42, 3.14minimummaximumexclusiveMinimummultipleOf
integer42number 的子集;无小数部分。
booleantrue / false无附加约束。
nullnull独立的类型;在允许 null 时显式使用。
array[…]itemsminItemsmaxItemsuniqueItems
object{…}propertiesrequiredadditionalProperties

组合关键字让你混搭使用:oneOf(恰好一个)、anyOf(至少一个)、allOf(全部)、not(取反)。还有 enum 表示一个有限的允许值列表,const 表示一个固定值。

自动生成的 schema 能告诉你什么、不能告诉你什么

从单一 JSON 示例推断 schema 强大但有限。生成器能检测:

它不能检测:

把输出当作完成度 70% 的起点。有价值的补充(哪些字段真的必需、适用什么字符串格式、允许什么值范围、每个字段意味着什么)是人工编辑这一步。

两个值得了解的微妙陷阱

JSON Schema vs Zod / Joi / Yup vs TypeScript 类型

有几种技术与 JSON Schema 的角色重叠;每种都有自己的甜点区:

如果你的 schema 需要被多种语言或工具(IDE、OpenAPI 工具链、代码生成器)消费,JSON Schema 是合适的家。如果你只待在一种语言里,该语言的原生选项通常写起来更舒服。

常见使用场景

常见错误

  1. 把自动生成的 schema 当作最终 spec。它是一个起点。加上格式提示、标记真正可选的字段、加上文档、设置值范围。
  2. 缺失 $schema 声明。验证器靠它知道应用哪个 draft。永远在 schema 顶部包含它。
  3. required 当成每个属性的属性。不像 XSD 或 Mongoose schema,JSON Schema 的 required 是父对象层面的一个数组,列出必需属性的名字。
  4. 想要严格验证时忘了 additionalProperties: false默认是 true,意思是未知键会被默默允许。
  5. enumexamples 搞混。enum = 允许值的列表(验证)。examples = 仅供文档用的示例值(无验证作用)。
  6. 假设 format 被强制执行。在 Draft 2020-12 里默认是注解,不是断言;你的 email regex 不会跑,除非你 opt-in。
  7. 从单一示例推断可选性。你示例里的每个键默认都变成 required。真实 spec 几乎都有可选字段;在编辑过程中把它们从 required 数组里移除。

更多常见问题

schema 能在 OpenAPI 3.1 里用吗?

能。OpenAPI 3.1(2021 年 2 月发布)把它的 schema 语言完全与 JSON Schema Draft 2020-12 对齐,这正是本生成器输出的内容。把 schema 放进你的 OpenAPI 文档的 components.schemas,通过 $ref 引用。更老的 OpenAPI 3.0 用的是更早的子集;如果你针对 3.0,可能需要调整。

我能从这个 schema 在我用的语言里生成类型吗?

可以。quicktype 能从一个 JSON Schema 生成 TypeScript、Go、Python、Java、C#、Swift、Kotlin、Rust、Elm 等等。json-schema-to-typescript 是个 JS 专属的替代。大多数现代语言至少有一个 schema-to-types 工具;生成的 schema 对所有这些工具都是合适的输入。

$defsdefinitions 有什么区别?

两者都是放可重用子 schema 的地方,你可以在文档其它位置 $ref 它们。definitions 是遗留名字,用在 Drafts 04、06 和 07。$defs 是当前名字,在 Draft 2019-09 引入并在 2020-12 中延续。功能上等价,但新工作请用 $defs

我的 JSON 会被发送到任何地方吗?

不会。Schema 生成完全在你的浏览器中运行。粘贴的 JSON 在本地解析、遍历,并作为 schema 输出到文本框。任何东西都不会被上传到服务器、记录或在你关闭标签页后保留。这一点很重要,因为 JSON 示例往往包含真实数据(客户记录、内部 API 响应、员工信息),你不想让这些数据流经第三方。

为什么我的数组的 schema 只描述了第一个元素?

从单一示例的推断把数组当作同质的:它看第一个元素,假设其余的相同。如果你真实数组可以包含不同形状,你需要手动把 items 写成 { "oneOf": [...] }。或者对每个变体分别运行生成器,然后合并 schema。

我到底应该用生成器,还是手写 schema?

对于一个你端到端控制的小 schema,手写让你更快学会规范。对于带几十个嵌套对象的大型 API 响应,生成几秒钟就给你一个草稿,你把省下的时间花在编辑约束、描述和 required 数组上。大多数干活的开发者两者都做:生成,然后编辑。

相关工具

免费在线 JSON 格式化器和验证器 JSON 比较器,免费 JSON → YAML 转换器,免费