JSON Schema 生成器 — 从示例数据生成 JSON Schema
从示例 JSON 数据生成 JSON Schema(Draft 2020-12)。自动推断类型、格式和必填字段,全部在浏览器中运行。无上传、无限制。
JSON Schema Generator
Generate a JSON Schema from sample JSON data. The tool infers types, detects required fields, and handles nested objects and arrays. Supports JSON Schema draft 2020-12. Works entirely in your browser.
JSON Schema 是描述 JSON 数据形态的标准方式。它扮演的角色,和 TypeScript interface、Go struct、Python 类型注解对强类型语言的意义相同:一份机器可读的描述,说明存在哪些字段、字段是什么类型、允许哪些取值、哪些字段是必填。区别在于 JSON Schema 本身就是 JSON,所以可以和处理它所描述的数据用同一套工具来存储、传输和处理。当前规范是 Draft 2020-12,相比更早的 Draft 7 和 Draft 4,它新增了递归类型、条件 schema 以及若干细节改进。
从样本数据生成 schema 是标准的起点。替代方案 —— 手工写 schema —— 在数据形态小且已知时可行;但面对真实世界的 API —— 几十个端点、上百个字段 —— 手工写就不现实了。从样本推断是合适的起点,前提是推断质量取决于样本。每一行样本都出现的字段是必填;样本中只出现过一次字符串值的字段会被推断为字符串。推断并不知道该字段本应是枚举,也不知道这个字符串本应匹配某个正则模式,更不知道数组本应有最小长度。这些约束在推断之后由人工补上。
最后再说一下交付环节:如果目标是 API 文档(OpenAPI、Swagger),生成的 schema 是起点 —— 加上 description、examples 和约束才能投产。如果目标是强类型语言的客户端(TypeScript、Go、Rust、C#、Java),把 JSON Schema 喂给 quicktype 这类代码生成器来产出对应的类型。如果目标是运行时校验器(JavaScript 的 ajv、Python 的 jsonschema、Java 的 networknt),schema 就是输入 —— 在处理前用 schema 校验传入的数据。生成的 schema 是一个有力的起点,但不能替代人工审阅。
使用方法
粘贴你的示例 JSON
把一个 JSON 文档,或一份由 JSON 对象组成的数组,放入输入区。生成器会遍历数据,根据哪些 key 在每个对象中都出现来推断类型并标记必填字段。
选择推断选项
开启「detect format」会为匹配常见模式的字符串值添加格式提示(email、date-time、uri、uuid)。开启「merge examples」会把源数据作为 `examples` 写入生成的 schema。
复制或下载 schema
把生成的 JSON Schema 复制到剪贴板,或下载为 .json 文件。输出兼容 Draft 2020-12,在任何现代 schema 校验器中都能通过验证。
常见问题
必填字段是怎么确定的?
如果一个字段在样本的每个对象中都出现,它就被标记为必填。如果样本是单个对象,那每个 key 都必填。如果样本是对象数组,则只有所有对象共有的 key 才必填。多加样本数据可以让推断更准确。
它能识别字符串的 format 吗?
可以 —— 开启「detect format」时,字符串值会按常见模式测试。`2023-01-15T10:30:00Z` 变成 `format: date-time`,`[email protected]` 变成 `format: email`,`https://example.com` 变成 `format: uri`。检测偏保守 —— 一次不匹配就会关掉该字段的格式提示。
嵌套对象和数组怎么处理?
嵌套对象会成为嵌套的 `properties` 块;对象数组会成为描述对象形态的 `items` schema。schema 是完全递归的 —— 每一层嵌套都会以各自的推断结构被捕获。
生成的 schema 能直接用于校验吗?
可以 —— 输出兼容 Draft 2020-12,能在 ajv、jsonschema(Python)以及其他现代校验器中通过验证。如果目标校验器只支持更老的 Draft 7 或 Draft 4,可以后处理一下输出,去掉 2020-12 特有的关键字(`prefixItems`、`if/then/else` 等)。
我能编辑生成的 schema 吗?
可以 —— 生成的 schema 就是普通 JSON。你可以补约束(minLength、maximum、pattern),加 `description` 字段做文档说明,或者调整推断出的类型。输出只是起点,不是终稿 —— 在把它当作数据形态的权威来源之前,请人工审一遍。
限制说明
- 推断质量取决于样本样本中推断为字符串的字段,实际可能只是一个写错成字符串的数字。schema 反映的是样本呈现的样子,不是数据本该是的样子。在把它当作权威来源之前,用多份真实样本验证一下。
- 不推断联合类型样本中同时出现字符串和数字的字段,会被推断为第一次看到的类型,而不是联合类型(`oneOf` 或 `anyOf`)。对多态数据,从同质样本分别生成多个 schema,再手工合并。
- 不做引用去重如果同一对象形态出现在多个位置,schema 会为每次出现生成独立的 `properties` 块。需要共享 schema 时,手动用 `$ref` 让它们指向同一个定义。
平台说明
- macOS
- 命令行场景下,Python 的 `gen-jsonschema` 和 `inferjson` 做类似的推断。本浏览器工具适合不值得为此安装 Python 包的一次性生成。
- Windows
- PowerShell 不能原生生成 JSON Schema。本浏览器工具适合临时性的 schema 生成;构建流水线用 `quicktype` CLI 或基于 Python 的生成器。
- Linux
- `quicktype --lang schema --top-level PascalCase` 是覆盖多语言的等价 CLI。本浏览器工具适合从聊天消息或 API 响应里粘贴 JSON 的一次性场景。
- Web
- 完全在客户端运行,页面加载后离线可用。对命令行工具或 Python 环境不可用的受限环境尤其有用。