JSON Schema 在生态中的位置:OpenAPI / AJV / Mock 联动

JSON Schema 不只用在校验。它是数据契约的枢纽:向上成为 OpenAPI 的复用单元,向下驱动 AJV 校验、实体类与 Mock 数据。 本文梳理这条链路,并演示以 JSON Schema 推断 为起点的多产物产出。

一、枢纽位置:一份契约,多方消费

把它想成中心节点:左边是「数据的形状从哪来」(真实报文 → 推断 Schema),右边是「形状被谁使用」(校验器、文档、代码、测试数据)。 没有统一 Schema 时,这些消费者各自维护一份定义,改结构就要满仓搜索替换。

  • 校验消费者:AJV 等校验器、API 网关、表单校验。
  • 契约消费者:OpenAPI 文档、接口平台、Mock Server。
  • 代码消费者:Java POJO、TypeScript interface、Go struct 等。
  • 数据消费者:示例 JSON、Mock 数据、测试夹具。

二、向上:成为 OpenAPI 的组件

OpenAPI 用 JSON Schema 描述请求与响应体,并集中在 components/schemas 里复用。因此一份写好的 JSON Schema,稍加包装即可被多个端点引用。典型做法是先有真实报文,用推断得到 Schema,再把它挪进 OpenAPI 的组件段。

复用手法与 $ref 与模块化 Schema 一脉相承:先在文档内用 definitions / $defs 抽取公共类型,再整体搬进 OpenAPI 的组件。

三、向下:AJV 校验与运行期防护

AJV 是 JS 生态最常用的 JSON Schema 校验器,输入即标准 Schema。推断得到的 draft-07 Schema 可直接用于 AJV, 在服务端入口或浏览器表单处做运行期校验。注意区分:Schema 能约束「形状」(类型、必填、枚举、format), 但跨字段业务规则(如「结束时间不早于开始时间」)仍要在业务层补规则。站内推断生成的 required / enum / format 正好构成最常用的一层防护。

四、向右:从 Schema 生成代码与数据

契约稳定后,重复劳动可以自动化。以站内链路为例:

  • 生成示例数据。Schema → JSON 示例 按 const / enum / default / format 生成符合约束的样例,用于联调与文档。
  • 生成实体类。 把同一份 JSON 交给实体生成工具,产出 Java POJO、TypeScript interface、Go struct 等, 后端 DTO 与前端类型保持同源。
  • 生成 Mock。智能 Mock 基于 JSON 或 Schema 生成带语义的假数据(姓名、邮箱、日期等),快速填充前端页面或测试夹具。

五、一条可复现的链路

把上面几步串起来,就是一条从真实报文到测试数据的完整流水线:

  1. 粘贴后端返回的真实 JSON 到推断工具,得到 draft-07 Schema。
  2. 按接口约定复核 required / enum / format(参考最佳实践一文)。
  3. 用反推工具生成示例数据,自证 Schema 能产出合法结构。
  4. 把 Schema 交给 AJV 做运行期校验、搬进 OpenAPI 做文档。
  5. 用同一份 JSON 生成实体类与 Mock 数据,前后端各取所需。

每一步都在浏览器本地完成,环节之间通过复制或跳转衔接,数据不出设备。

六、常见误区

  • 把 Schema 当万能校验。它管形状不管业务规则;跨字段依赖、时序约束必须在业务层实现。
  • 契约与代码各写一份。结构变动时容易漏改,应让 Schema 作为单一真相并在 CI 里校验。
  • format 当硬约束。多数校验器对 format 默认为提示级;要硬失败需显式开启或补正则。
  • Mock 当真实数据。Mock 只为结构与语义逼真,不含真实业务取值,切勿用于生产或真实统计。

动手跑一遍

从一份真实 JSON 出发,依次推断 Schema、生成示例、生成实体类与 Mock 数据,走一遍同一条链路。全部在本地完成。

常见问题

JSON Schema 和 OpenAPI 是什么关系?

OpenAPI 用 JSON Schema(子集)来描述请求体、响应体与参数的结构,放在 components/schemas 里供各接口复用。也就是说,写好一份 JSON Schema,稍作包装就能作为 OpenAPI 的组件被多个端点引用,它们是「通用数据契约」与「HTTP 接口契约」的关系。

AJV 是做什么的?

AJV 是 JavaScript 生态最常用的 JSON Schema 校验器,按 draft-07 / 2019-09 / 2020-12 语义校验数据,可在 Node 服务端或浏览器里运行。它的输入就是标准 JSON Schema,因此站内推断出的 Schema 可直接交给 AJV 做运行期校验。

一份 Schema 能产出哪些东西?

常见有三类:校验(AJV、接口网关)、文档与契约(OpenAPI、接口文档)、产物代码与数据(实体类、TypeScript 类型、Mock 数据、示例 JSON)。同一份 Schema 是它们的单一真相,改结构只需改一处。

站内是怎么联动这条链路的?

先用 JSON Schema 推断从真实报文得到 Schema,再用「Schema → JSON 示例」验证并产出示例。需要代码时用 JSON 转实体类生成 POJO / interface,需要测试数据时用智能 Mock 生成符合语义的数据。各工具之间可以直接跳转,减少复制粘贴。

这条链路里数据会上传吗?

不会。推断、示例生成、实体类生成、Mock 生成都在浏览器本地完成,站点没有后端。唯一的网络请求来自你主动发起的(如 AI 生成)调用,采用 BYOK 模式,密钥只存在本地。

相关工具