JSON 转 JSON Schema

转换器

从样例 JSON 一键生成 JSON Schema(Draft-07),自动推断 properties、required 与数组类型。自动推断属性、必填项与数组元素类型,嵌套对象生成独立定义。输出符合主流浏览器与校验库支持的规范版本。输出可直接用于校验配置。可切换规范的草稿版本输出。

已生成
JSON
JSON Schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "active": {
      "type": "boolean"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "profile": {
      "type": "object",
      "properties": {
        "age": {
          "type": "integer"
        },
        "city": {
          "type": "string"
        }
      },
      "required": [
        "age",
        "city"
      ]
    }
  },
  "required": [
    "id",
    "name",
    "active",
    "tags",
    "profile"
  ]
}

关于 JSON 转 JSON Schema

JSON 转 JSON Schema 工具根据一段示例 JSON 自动推断字段类型、是否必填与嵌套结构,生成符合 Draft-07 或 2020-12 规范的 JSON Schema。它能显著降低手写 Schema 的成本,帮助你为接口请求体、配置文件或数据管道快速建立校验规则。推断结果可在右侧编辑微调,并复制粘贴到代码或表单校验库中。解析完全在浏览器本地进行,示例数据不会上传,适合处理含有业务字段定义的敏感样例。生成的 Schema 同时可作为文档,让前后端对数据结构达成共识,也便于接入 Ajv 等校验库做运行时数据质量把关。对于接口文档自动化,导出的 Schema 还能直接挂到 OpenAPI 里作为请求体定义复用;它既可作为运行时校验规则接入 Ajv 等库,也能当作前后端对数据结构的书面约定,减少因字段类型不一致导致的联调返工与潜在的线上数据质量问题。

从实例推导结构是一种「归纳」,得到的是「这份样本长这样」而不是「数据必须这样」。因此推断结果天然带有样本偏差:样本里恰好都出现的字段会被当成必填,偶然缺失的字段会被当成可选,而真正的约束(例如取值范围、字符串长度上限)在样本里根本看不出来。因此推断只能作为起点,随后必须由人补充意图。

数组是最容易推断失真的地方,因为单个样本往往只体现一种元素形态。同一数组在不同记录里可能是对象、字符串或数字,而推断工具通常取第一个元素或取交集,结果可能与实际不符。因此当结构里含数组时,应当用多份样本一起推断,或人工确认元素类型是否唯一,而不是直接接受推断结果。

格式类约束(日期、邮箱、标识符)无法从字面形式可靠地推导出来,这一层必须人工补上。同一串字符看起来像日期,也可能只是一个恰好符合日期形态的编号;反过来,一个字符串字段其实承载日期,但样本里全是难以识别的写法。因此格式约束应当由了解业务的人显式声明,而不是交给模式匹配去猜。

把重复出现的结构抽成可复用定义,是让结果可维护的关键一步。若同一形状在多个位置重复内联,任何一处调整都要同步修改多处,容易漏改;而抽成一个可被引用的定义后,修改集中在一点,且能保证各处一致。因此在生成之后应做一次结构梳理,把重复形状提取出来,即使这会让文件看起来复杂一些。

严格程度的选择需要与用途匹配,因为约束越严越容易拒绝合法数据。用于宽松校验时,只声明结构与类型即可,便于数据在演进中保持兼容;用于对外接口契约时,则需要把必填、枚举与格式一并固化,代价是每次扩展都要同步更新契约。因此同一份数据可能需要两个层次的描述,而不是只有一个最严格的版本。

最后,推断结果应当纳入版本管理并与真实数据保持对照。数据形态会随业务变化,而描述文件若长期不更新,会逐渐变成一份过时的说明,甚至比没有更糟,因为使用者会误以为它是准确的。因此把「样本变化后重新推断并人工复核」当作一个固定环节,比一次性生成后长期不管更有价值。

实现原理

从样例推断模式只能得到「样本里满足的约束」,而模式的用途恰恰是描述不变量。因此推断结果往往过于宽松(必填项被标成可选)或过于严格(把某次出现的取值写成枚举)。正确用法是把它当作起点,再人工收紧必填项、补齐取值范围与格式声明。

输入样例 {"id":1,"tags":["a"]}
输出推断出 id 为整数、tags 为字符串数组,但**哪些字段必填无法从单一样本推断**——需要人工补齐 required

使用方法

  1. 打开「JSON 转 JSON Schema」
  2. 选择源格式与目标格式
  3. 根据需要调整输出选项
  4. 点击「转换」按钮,结果实时显示
  5. 复制或导出结果

使用场景

  • 接口契约校验 — 为 API 请求/响应生成 schema,用于运行时校验,拦截不合法的数据。
  • 表单与配置校验 — 把配置样例转成 schema,配合 ajv 等库校验用户输入或配置文件。
  • 生成 OpenAPI 片段 — 快速得到 schema 作为 OpenAPI/Swagger 文档中 components 的基础。
  • 数据质量门禁 — 在数据管道中用 schema 做入口校验,保证下游消费的数据结构稳定。
  • 团队结构对齐 — 用 schema 作为前后端共享的结构契约,减少沟通成本。

常见问题

生成的是哪个版本的 schema?

默认输出 JSON Schema Draft-07,兼容 ajv 等主流校验库。复制后可按需改成其它草案版本。

所有字段都会被标记 required 吗?

可以通过「标记 required」开关控制。开启时样例中出现的字段都会列入 required;如有可选字段,关闭后再手动调整更合适。

数组里类型不一致怎么处理?

当数组元素类型不同,工具会用 anyOf 列出各种可能的子 schema,尽量贴合真实数据。

整数和小数会区分吗?

会。整数推断为 integer,带小数的数字推断为 number,便于更精确的校验。

可以校验我的 JSON 吗?

本工具负责生成 schema。生成后你可以用 ajv、jsonschema 等库,或在线校验器对真实数据进行校验。

生成的 schema 太宽松、可接受太多值怎么办?

因为工具只从样例反推,样例里出现过 null 会把字段加成 anyOf 并含 null,空对象 {} 只能推断成 { } 等于什么都能装,样例越精简 schema 就越宽松。想收紧,可在右侧编辑器把 anyOf 里多余的 null 或类型分支删掉,给空对象补上 properties 和 required,并按业务加上 pattern 正则、minimum/maximum、maxLength 等约束,再拿真实样例跑一遍校验,看仍能通过哪些不该通过的值,逐步收敛到只放行实际业务允许的取值。

怎么给字段加枚举和 uniqueItems 这类约束?

生成后在右侧编辑器直接改对应字段的 schema 对象:给字符串加 pattern 或 minLength,给数字加 minimum/maximum,固定取值集合加 enum 数组,数组内容不重复加 uniqueItems:true。改完可复制进 ajv 等校验库,用一段真实数组各跑一遍,确认约束行为符合预期。约束越具体,运行时能拦下的脏数据越多,生成的 schema 也能当作接口契约与协作文档使用,减少联调阶段的类型不一致问题。

生成的 schema 里 required 字段是怎么定的?

按样本:该字段在所有对象样本里都出现就标记 required,缺失过就进 optional。样本越少判断越粗糙。严谨做法是给多个真实响应样本,或生成后手动审一遍 required 列表——schema 是接口契约,错一个字段下游都会踩坑。

广告