跳到主要内容
数据处理2026-05-195 分钟阅读

在线 JSON Schema 生成器:从 JSON 数据自动生成 Schema 定义

什么是 JSON Schema

JSON Schema 是一个用于描述和验证 JSON 数据结构的标准。它定义了 JSON 对象的属性、类型、约束和默认值。把样例数据贴进我们的 JSON Schema 生成器,即可自动生成可直接使用的 Schema。

示例 JSON Schema

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": { "type": "string", "minLength": 1 },
    "age": { "type": "integer", "minimum": 0 },
    "email": { "type": "string", "format": "email" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "required": ["name", "email"]
}

为什么需要 JSON Schema

  1. API 文档:自动生成 API 请求/响应的结构文档
  2. 数据验证:在运行时验证 JSON 数据的正确性(JSON Schema 编辑器可以在浏览器里边写边校验)
  3. 表单生成:基于 Schema 自动生成表单 UI
  4. Mock 数据:根据 Schema 生成测试数据
  5. 类型安全:为 TypeScript 接口生成类型定义
  6. 配置验证:验证配置文件的格式是否正确

JSON Schema 核心关键字

关键字说明示例
type数据类型"string", "number", "boolean", "array", "object"
properties对象属性{ "name": { "type": "string" } }
required必填字段["name", "email"]
minimum/maximum数值范围"minimum": 0, "maximum": 100
minLength/maxLength字符串长度"minLength": 1, "maxLength": 255
enum枚举值["active", "inactive", "pending"]
format格式验证"email", "uri", "date-time"
items数组元素类型{ "type": "string" }

如何使用在线工具

使用 ToolVault 工具匣 的 JSON Schema 生成器:

  1. 粘贴一个 JSON 对象示例
  2. 按需开启选项:勾选「推断 format」让 email、date-time、uri、uuid、IP 地址等样本值自动产出 "format" 注解;「规范版本」可切换 $schema 声明为 draft-07 或 2020-12
  3. 点击生成,工具分析数据结构(嵌套对象、数组元素、可空字段都会正确处理)
  4. 一键复制 Schema 代码,再按契约手工收紧 required / enum / pattern

从 JSON 示例自动生成

输入

{
  "id": 1,
  "name": "张三",
  "email": "zhang@example.com",
  "isActive": true,
  "tags": ["developer", "admin"],
  "address": {
    "city": "上海",
    "zip": "200000"
  }
}

输出 Schema

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "name": { "type": "string" },
    "email": { "type": "string" },
    "isActive": { "type": "boolean" },
    "tags": { "type": "array", "items": { "type": "string" } },
    "address": {
      "type": "object",
      "properties": {
        "city": { "type": "string" },
        "zip": { "type": "string" }
      }
    }
  }
}

代码中的 JSON Schema 验证

JavaScript(Ajv)

const Ajv = require('ajv');
const ajv = new Ajv();

const schema = {
  type: 'object',
  properties: {
    name: { type: 'string', minLength: 1 },
    age: { type: 'integer', minimum: 0 }
  },
  required: ['name']
};

const validate = ajv.compile(schema);
const valid = validate({ name: '张三', age: 28 });
console.log(valid); // true

Python

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name"]
}

try:
    validate(instance={"name": "张三", "age": 28}, schema=schema)
    print("验证通过")
except ValidationError as e:
    print(f"验证失败: {e.message}")

单样本推断的先天局限

从单个样本生成的 schema 是「描述」不是「约束」——它记录了看到的(所有字段必填、类型按观察、无边界),漏掉了变异的一切(那天恰好不在的可选字段、字符串格式、数值范围、枚举里只有一个值时的枚举)。生成纪律:喂多样本(三个差异大的样本胜过一个完美样本);把推断结果当草稿(一小时的收紧——类型加边界、真可选字段标记——把描述变成契约);有任何真实源头(TypeScript 类型、OpenAPI、数据库 DDL)就从源头生成而不是从数据考古。单样本 schema 直接上线是「用今天的数据建的闸门挡今天的数据」——测试全过的假信心机器。

draft 版本:改变输出的生成器设置

draft 选择器(draft-04 / draft-07 / 2019-09 / 2020-12)不是装饰:exclusiveMinimum 在 draft-04 是布尔修饰符、draft-07+ 变数值;definitions 在 2019-09 改名 $defs;$ref 语义在 2019-09 与相邻关键字分离(draft-07 忽略兄弟关键字,之后处理)。给现代验证器生成 draft-04 输出 = 静默验证错误或加载失败。选择规则:配你将运行的验证器(Ajv 8 默认 2020-12、Python jsonschema 历史默认 draft-07),在工具链配置里锁定版本而非接受 latest——draft 升级是 schema 语义的破坏性变更,不是工具小更新。

Schema 演进:不破坏消费者的版本化

Schema 会变、消费者代码不会同步更新。值得记住的兼容性规则:加可选字段是向后兼容(旧数据过新 schema)但向前兼容需要 additionalProperties 允许未知字段(生产中最被忽视的开关);收窄类型(string 变 string+enum)向后兼容但破坏向前;删除和改名双向破坏。运维模式:把 schema 文件当 API 对待——版本化、兼容性 CI(每次变更用旧样本对新 schema 验证)、跨发布边界先废弃再删除。等消费者拒收周二的某条数据时才「发现」不兼容,就是这套纪律要防的事故。

生成器能提示的 format(以及仍需人手的部分)

开启 推断 format 后,看起来像邮箱、URI、UUID、IPv4/IPv6 或日期时间的样例字符串会带上 "format" 注解。这是文档与部分校验库的提示,不保证每个消费库行为一致。数值边界、enum、required 几乎总要人工过一遍:一份样例无法知道明天的可选字段,也无法知道状态码的封闭列表。

生成后,把 Schema 贴进 JSON Schema 校验器,再用第二份故意不同的载荷(缺可选键、多未知字段、边界数字)试一遍。若样例与对抗载荷都「轻松通过」,说明 Schema 仍是描述,还不是契约。

FAQ

JSON Schema 支持哪些版本?

当前常用的是 Draft 7(2018-02)和 2020-12。Draft 7 在库兼容面上更稳妥;若校验器与 $defs / $ref 兄弟规则已按 2020-12 约定,再选该草案。把 draft 钉在工具链配置里,而不是追「最新」。

Schema 和 TypeScript 接口可以互转吗?

可以。使用 typescript-json-schema 从 TS 生成 Schema,或使用 json-schema-to-typescript 从 Schema 生成 TS 接口。工具可自动化这个过程。

JSON Schema 能验证嵌套对象吗?

可以。JSON Schema 天然支持嵌套对象定义,使用递归的 properties 描述深层结构。也支持 $ref 关键字引用已定义的子 Schema,避免重复定义。

排查注记

「单样本推断的先天局限」放在教程正文之后,因为它才是生成的本质边界:单样本 schema 是「描述」不是「约束」,直接上线就是「用今天的数据建的闸门挡今天的数据」——测试全过的假信心机器。生成纪律因此给得很具体:三个差异大的样本胜过一个完美样本;有 TypeScript、OpenAPI、DDL 这类真实源头就从源头生成、不做数据考古。draft 一节把版本差异列成破坏性变更(exclusiveMinimum 从布尔变数值、definitions 改名 $defs),结论是版本锁进工具链配置、别追最新;验收标准同样直白——样例和对抗载荷都轻松通过,说明 Schema 仍是描述、还不是契约。


本文由 ToolVault 工具匣 提供。更多免费本地工具见 首页。