JSON Schema 从入门到工程化
关键字很多,真正天天用的只有十几个。把 type/properties/required/$ref 用对,再处理好错误信息,就能覆盖八成场景。
进阶约 14 分钟更新于 2026-10-30
用 JSON Schema 描述数据形状,把「口头约定」变成可执行校验,并进一步驱动 TypeScript 类型与表单生成。
7 篇文章关键字很多,真正天天用的只有十几个。把 type/properties/required/$ref 用对,再处理好错误信息,就能覆盖八成场景。
类型和 schema 各管一段:一个在编译期,一个在运行时。问题不是选哪个,而是如何让两者自动保持一致。
把示例 JSON 丢进生成器,得到的 schema 往往一上线就拦掉正常数据。本文用五条同形状记录做对照实测,说明「样本越全反而越糟」的原因,并给出多条采样、语义补全、错误定位的完整落地流程。
$ref 解决复用,allOf/oneOf 解决组合,两者叠在一起最容易出事。本文按解析顺序讲清 $id、$defs、条件分支、循环引用与打包,并给出可复现的调试路径。
校验器给出的是一串机器错误,用户需要的是「哪个输入框错了」。本文拆解 Ajv 的 errors 数组,讲清 instancePath 与 schemaPath 的差别,并给出归类、自定义文案、国际化与前端呈现的完整方案。
校验通过不代表数据干净。Pydantic 默认忽略未知字段,Zod 默认剥离,Ajv 默认放行——模型编造的参数、拼错的键都会静默穿过。本文用实测说明静默放行的三种形态,并给出关闭对象、控制强转、逐层收口的完整写法。
schema 写完不改就是坏的起点:一个 typo 让校验器静默放行,一次重构让 fixture 全线误报。本文给出一套可落地的契约测试方案——正例、负例、快照三件套,schema 本身先进 lint,编译一次复用,再把四道闸门焊进 CI,让契约坏了构建先红。