toolgarden.xyz
EN
JSON Schema接口校验JSON 校验API

JSON Schema 是什么?如何用它校验接口数据

JSON Schema 是描述 JSON 数据结构的规则文档,可以规定字段类型、必填项、数组元素、字符串格式和对象结构。

ToolGarden 推荐的工具优先在浏览器本地运行,文件和文本不必上传到服务器,适合更注重安全隐私的日常处理。

发布于 2026年7月2日更新于 2026年8月3日约 7 分钟阅读作者 ToolGarden

JSON Schema 可以理解为 JSON 数据的结构说明书:哪些字段必须存在、每个字段是什么类型、数组里应该放什么,都可以写成规则。

在接口联调、配置校验、低代码表单和数据导入场景中,JSON Schema 可以帮助你在数据进入业务逻辑前先发现结构错误。

从一段 JSON 开始

{
  "id": 1001,
  "email": "user@example.com",
  "roles": ["admin"],
  "active": true
}

这段数据包含数字、字符串、数组和布尔值。对应的 Schema 可以描述每个字段的类型以及必填规则。

{
  "type": "object",
  "required": ["id", "email", "roles", "active"],
  "properties": {
    "id": { "type": "number" },
    "email": { "type": "string", "format": "email" },
    "roles": {
      "type": "array",
      "items": { "type": "string" }
    },
    "active": { "type": "boolean" }
  }
}

常用字段是什么意思?

Schema 字段作用例子
type限制值的基础类型object、array、string、number
properties描述对象里的字段email、roles、active
required规定必须出现的字段id、email
items描述数组元素类型roles 里的每一项是 string
format补充字符串格式语义email、uri、date-time

接口校验怎么用?

  1. 用真实接口样本生成第一版 Schema。
  2. 根据接口文档补充 required、format、enum、minLength 等规则。
  3. 用 Schema 校验真实请求或响应数据。
  4. 根据错误路径定位具体字段,再修正数据或调整规则。

从样本生成的 Schema 只是起点

生成器只能观察样本里已经出现的值。它无法知道某个字段是否可能缺失,字符串是不是固定枚举,数字有没有上下限,也无法从一个 null 推断真实业务类型。因此自动结果适合搭建骨架,最终约束仍要对照接口文档、数据库规则和异常样本补齐。

样本现象自动推断的盲点人工补充
字段每次都出现不代表业务上必填按合同决定是否放入 required
值是 paid看不出还有 draft 或 failed补充 enum 或 oneOf
数组只有一项看不出其它元素形态加入更多样本并检查 items
对象没有额外字段看不出是否允许扩展明确 additionalProperties 策略

校验通过也不等于业务正确

Schema 主要验证结构与声明的约束。即使 email 格式正确,也不能证明邮箱真实存在;即使金额是正数,也不能证明订单允许退款;format 关键字是否强制检查还取决于验证器配置。把 Schema 放在输入边界用于尽早拒绝坏数据,跨字段规则、权限和业务状态仍应由应用代码处理。

团队还应固定所使用的 JSON Schema draft 与验证器版本。不同 draft 的关键字和引用行为可能不同,Schema 文件最好声明 $schema,并把验证规则纳入接口测试,避免生产端和文档端使用不同解释。

总结

JSON Schema 的价值不只是说明数据长什么样,更重要的是把结构约束变成可执行校验,减少接口和数据流里的隐性错误。

常见问题

Q.JSON Schema 和 TypeScript interface 有什么本质区别?

TypeScript interface 只在编译期存在,运行时无法阻止一个不合法的 JSON 进入系统;JSON Schema 是运行时契约,可以在接收接口、写入数据库前真正执行校验。前者服务于开发体验,后者服务于系统健壮性。实际项目里两者结合使用效果最好:用 JSON Schema 作为唯一事实源,通过 json-schema-to-typescript 生成 interface,同时用 ajv 在运行时校验。这样类型提示、运行时保护、文档、mock 数据都能从同一份定义派生,避免多头维护。

Q.什么时候不适合用 JSON Schema,而是应该写自定义校验函数?

JSON Schema 擅长结构性规则:字段是否存在、类型是否正确、字符串长度、数字范围、枚举、正则等。但它不擅长跨字段的业务规则,比如结束日期必须晚于开始日期、优惠券金额不能超过订单金额、下单人和收货人身份证一致等。这些应该在业务层写显式函数,或者用支持自定义关键字的库来扩展 Schema。经验做法是:Schema 负责挡住格式错误,业务函数负责挡住业务错误,两层过滤后再进入核心逻辑。

Q.JSON Schema 版本这么多(draft-04、07、2019-09、2020-12),选哪个?

如果没有历史包袱,直接选 draft 2020-12,它是目前最新的标准,也是 OpenAPI 3.1 采用的版本。draft-07 应用最广,几乎所有语言库都支持,是最保险的默认值。draft-04 只在维护老系统时才考虑。切换版本时注意 items 和 additionalItems 的语义有过调整,$ref 和 $id 的行为也变化过。建议在项目里显式声明 $schema,让工具链和校验器都能知道用哪套规则解析。

Q.怎么把 JSON Schema 用在前端表单校验上?

常见做法是使用 react-jsonschema-form、Formily、AJV 加自研渲染层。Schema 描述字段类型和约束,UI Schema 描述控件类型和布局,两者分离让业务规则可以复用到前后端。前端提交前跑一次 ajv 校验,把 errorMessage 关键字里的中文提示直接呈现给用户;后端收到时再校验一次,防止绕过前端。这样前后端共享同一份规则,避免出现前端过但后端拒的情况,也让新增字段只需改 Schema。

Q.JSON Schema 校验失败时错误信息太长,怎么给用户友好提示?

ajv 默认返回的错误路径像 /profile/0/email,普通用户看不懂。改进方法有几种:在 Schema 里加 errorMessage 关键字(需要 ajv-errors 插件)覆盖默认文案;写一个 formatError 函数把路径映射成业务字段名,比如把 /orderItems/0/qty 转成第 1 件商品的数量;聚合同一字段的多个错误,只展示最关键的一条;对国际化用户使用不同语言的 messages 文件。原始错误可以打到日志用于排查,展示给用户的版本必须简短明确。