ToolAct

JSON Schema 生成器

JSON 输入
JSON Schema 输出

配置选项说明

Schema ID
设置 Schema 的唯一标识符,通常使用 URI 格式,用于在大型系统中引用和识别 Schema
所有字段必填
启用后,所有属性都会被添加到 required 数组中,表示这些字段在数据中必须存在
添加默认值
根据示例 JSON 中的实际值自动生成 default 属性,适用于配置文件等需要默认值的场景
添加字段描述
自动为每个属性添加 description 字段,描述该字段的数据类型和来源,便于文档生成
严格模式
启用 additionalProperties: false,禁止出现 Schema 中未定义的额外属性,确保数据结构严格一致

什么是 JSON Schema?

JSON Schema 是一种用于描述和验证 JSON 数据结构的规范。它定义了 JSON 文档应有的结构、数据类型、约束条件等规则,广泛应用于 API 数据验证、表单验证、配置文件校验等场景。

通过 JSON Schema,您可以:

  • 数据验证:验证 JSON 数据是否符合预期的格式和约束
  • 文档生成:为 API 自动生成文档和类型定义
  • 代码提示:在 IDE 中获得智能补全和类型检查
  • 自动化测试:在测试中自动验证响应数据格式

本工具支持 JSON Schema Draft-07 规范,能够智能推断嵌套对象、数组类型、枚举值等复杂结构,帮助您快速创建标准化的 Schema 定义。

使用方法

如何使用

  1. 在左侧输入框粘贴 JSON 数据,或点击“示例”加载示例数据
  2. 配置选项:设置 Schema ID、选择是否所有字段必填、添加默认值等
  3. 右侧会自动生成对应的 JSON Schema 定义
  4. 点击“复制”将生成的 Schema 复制到剪贴板
  5. 将 Schema 用于 API 校验、表单验证或配置文件检查

Schema 提示

  • 生成的 Schema 反映您提供的示例 JSON,复制结果前请确保包含代表性的可选字段、空值、数组及边界情况。
  • 请手动核对必填字段以及数字/字符串格式;基于示例的推断无法覆盖所有业务规则。

使用场景

从真实 API 样本草拟 Schema粘贴一份有代表性的 JSON 响应,生成符合 Draft-07 规范的 Schema,涵盖对象属性、基础类型、嵌套数组、默认值和必填字段。它为前后端团队提供一个具体的起点,后续再手动补充边界情况。真实样本优于猜测,因为必填与可选、枚举成员都是从实际数据中推断出来的。
为配置文件生成文档对于内部配置示例,启用默认值和字段描述,生成在编辑器和文档中都实用的 Schema。严格模式可添加 additionalProperties: false,接入校验后能更方便地捕获意外字段。配合 CI 检查使用,当配置文件不再匹配契约时构建就会失败。
在正式校验前探索数据结构生成器会报告属性数量并从样本元素推断数组类型,帮助你快速了解载荷的大致结构。当有真实样本但尚未编写正式契约时,这一步特别实用。结构确定后,再将 Schema 交给类型生成器以获得更强的类型绑定。
用 nullable 和 required 提示收紧推断类型使用严格模式和 nullable 选项,让生成的 Draft-07 Schema 正确标记可选字段,而不是假设每个键都始终存在。请手动检查生成的 required 数组,因为一个缺失的样本值可能隐藏了服务端实际必填的字段。将 nullable 处理与 required 独立切换,才能准确建模「允许 null 但仍要求存在」的字段。
区分 Draft-07 与 2020-12 以及枚举推断本生成器默认输出 JSON Schema Draft-07,这仍是 Ajv、jsonschema 和表单库中支持最广泛的版本;较新的项目可能需要手动升级到 2020-12 以使用 if/then/else、prefixItems 或 const 关键字。枚举推断基于启发式规则:当某个字符串字段在样本中出现的不同值少于约 10 个时,会自动提升为 enum,因此对于 status 这类应保持自由文本的字段请仔细复核。将生成的 Draft-07 Schema 视为起点草稿,再根据消费端库的支持情况用转换工具升级到 2020-12。

技术原理

JSON Schema 是一种用于标注和验证 JSON 文档的声明式词汇表,定义跨越多个 IETF 草案(Draft 4 / 6 / 7 / 2019-09 / 2020-12)。最新版本是 Draft 2020-12,定义了七种原始类型(string、number、integer、boolean、array、object、null)、开放式 format 词汇表(email、uri、date-time、uuid、ipv4、hostname 等)以及数十个约束关键字:pattern(正则表达式)、minimum/maximum/exclusiveMinimum/exclusiveMaximum(数值范围)、minLength/maxLength(字符串长度)、minItems/maxItems/uniqueItems(数组约束)、required(对象级别的必填数组)、additionalProperties(是否允许额外字段)、enum 和 const(允许值)以及 $ref(子 Schema 复用)。本页面默认生成 Draft 2020-12 输出,也可通过下拉框选择较旧的 Draft-07(目前在生产 Schema 中仍最常见)。

生成器的推断过程是对用户提供的 JSON 进行单次遍历,递归构建 Schema 对象。推断的核心映射规则为:整数(Number.isInteger 且无小数部分)-> {type: 'integer'},浮点数 -> {type: 'number'},字符串 -> {type: 'string'},布尔值 -> {type: 'boolean'},数组 -> {type: 'array', items: <对第一个元素递归>} 或 Draft 2020-12 中的元组 {type: 'array', prefixItems: [...]},对象 -> {type: 'object', properties: <对每个键递归>},null -> {type: 'null'}。对于混合元素类型的数组,生成器发出 oneOf 子 Schema 覆盖每种观察到的类型。

对于多个样本对象,生成器通过比较来组装 required 列表:如果一个键在每个样本中都出现则为必填,如果任何样本省略了则为可选。当样本数据聚集时会推断模式和约束:如果某个字段的所有数字都落在 [1, 100] 范围内,生成器发出 {type: 'integer', minimum: 1, maximum: 100};如果某个字符串字段始终是 UUID,生成器会标记 format: 'uuid' 并发出 pattern: '^[0-9a-f]{8}-...' 正则。枚举推断在字符串字段跨样本取值不超过 10 个不同值时触发(如 role: 'admin' | 'editor' | 'viewer' 全部被观察到),此时生成器发出 enum 数组。

深层嵌套对象和递归结构被提取到 $defs 节(Draft 2020-12;旧版 $definitions 是 Draft-07 关键字)并通过 $ref 引用。递归结构——例如树节点的 children 字段类型为树节点——获得一个指向父级 $defs 条目的存根 $ref,验证器在验证时解析。生成器自动选择正确的内联与引用权衡:浅层 Schema 保持内联,深层 Schema 拆分为定义以保持输出可读性。生成的 Schema 对给定输入是确定性的:相同的 JSON 样本始终产生相同的 Schema,且生成器以纯 JavaScript 实现,无远程调用。

  • 类型推断规则:整数 -> integer,浮点数 -> number,字符串 -> string,布尔值 -> boolean,数组 -> array + items,对象 -> object + properties。JSON null -> type: null(Draft 6+)或 type: 'null' 字符串。
  • 必填字段检测:比较所有样本对象,在每个对象中都存在的字段被视为必填,添加到 required 数组;缺失的字段为可选。单样本输入时 required 为空数组,因为启发式规则至少需要两个样本。
  • 枚举推断启发式:当某个字段在样本中取少量有限的不同字符串值(基数 <= 10)时,自动识别为 enum 约束。更大的基数保持为普通 string 类型。
  • 自动检测 format:基于字符串特征,字段被标记为 email、uri、date-time、uuid 等格式提示,用于文档和验证。format 关键字在 Draft 2020-12 中是信息性的——验证器可选择强制执行或忽略。
  • 嵌套 $ref 提取:深层嵌套对象被提取到内部 $defs(Draft 2020-12 关键字;旧版 $definitions 来自 Draft 7)并通过 $ref 引用,避免 Schema 过于冗长。递归结构获得指向父级 $defs 条目的存根 $ref。
  • 约束扩展:除基本类型外,还可添加 minimum/maximum(数值范围)、minLength/maxLength(字符串长度)、pattern(正则表达式)等约束。当输入样本在特定值上聚集时,生成器会发出这些约束。
  • Draft 选择:2020-12(最新版)为默认且使用 $defs;2019-09 同样使用 $defs;Draft-07 使用 $definitions,是大多数现有工具仍在使用的版本。Draft 6 引入了严格 required 语义,必填字段列在父级的 required 数组中而非作为同级属性。
  • 组合关键字(Draft 2019-09+):allOf(必须匹配所有子 Schema)、anyOf(至少匹配一个)、oneOf(恰好匹配一个)、not(必须不匹配)。当样本值适合两个不相交的子 Schema(如 integer 与 string)时,生成器选择 oneOf。

示例

简单对象 -> Schema

{"name": "Alice", "age": 25}
->
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer" }
  },
  "required": ["name", "age"]
}

包含数组的 Schema

{"tags": ["js", "ts"]}
->
{
  "type": "object",
  "properties": {
    "tags": {
      "type": "array",
      "items": { "type": "string" }
    }
  }
}

包含枚举的 Schema

{"role": "admin"}
->
{
  "type": "object",
  "properties": {
    "role": { "type": "string", "enum": ["admin", "user", "guest"] }
  }
}

常见问题

什么是 JSON Schema?

JSON Schema(当前为 2020-12 草案)是一种用于校验 JSON 文档的词汇表,用于描述文档应有的结构——包括字段、类型、取值范围、模式等,类似 XML Schema 或 TypeScript 类型。Ajv、Hyperjump 以及大多数 API 框架都支持它,用于运行时校验。

生成器输出哪个版本的 JSON Schema?

现代草案版本(通常是 2020-12 或 draft-07)。输出会以 $schema 声明版本,必要时附 $id、type 以及对象、数组、字符串、数字、布尔、null 各类型的相应关键字。如果你的校验器要求特定旧版本,可切换 draft 选项。

它如何从 JSON 样例推断类型?

它会遍历样例,记录每个属性的类型。对于数组,它根据一个或多个元素推断 items 的 schema(元素类型不同时取并集);对于混合类型属性,使用 oneOf 或 anyOf。结果是一个相对宽松的初始 schema;后续可手工收紧约束(如 required、minLength、pattern)。

所有属性都会被标为必填吗?

可配置。默认会把所有出现过的属性标为必填。如果样例只是一个示例,其他实例可能合理地缺少某些字段,可开启「全部可选」。生成后也可手动编辑 required 数组。

嵌套对象和数组如何处理?

嵌套对象会变为嵌套的 properties 块;数组会变为 items 定义。深层嵌套不成问题。如果同一结构反复出现,可在生成后用 $defs / $ref 重构——生成器不会自动去重。

它推断不出哪些内容?

格式约束(date-time、email、uuid)、枚举值、正则表达式、最小/最大值、minItems/maxItems、依赖关系等,都需要手工补充,因为单一样例无法体现这些信息。请把生成的 schema 当作骨架,再做精细化收紧。

我的 JSON 会被上传吗?

不会。推断在本地完成,粘贴的 JSON 不会离开浏览器。