Schema 与实例校验

JSON Schema 校验让约束与真实数据对应起来

可先运行示例。只检查 Schema 无需实例;校验实例则同时检查 Schema 与数据。

JSON Schema 校验

JSON Schema

JSON 实例

输入与引用均在此浏览器处理,不上传校验数据,也不抓取远程引用。

校验选项

关闭时 format 仅作注释;开启后检查 ajv-formats 支持的格式,未知格式会编译失败。

本地引用

最多 10 份 JSON 文件,每份需要唯一的根绝对 $id,且不含 #。文件名不参与引用解析。

暂无引用文件。

    准备好后手动校验。

    JSON Schema 校验 能发现接口要求整数却返回字符串、必填字段缺失或对象出现额外键等问题。JSON 语法正确并不代表契约成立。把约束与实际响应并排查看,才能判断应该修改数据还是规则。

    JSON Schema 验证不会替你修正输入。字段缺失与字段值为 null 是不同情况;default 注释也不会自动填入一个缺少的键。

    为什么使用 JSON Schema 校验?

    从数据位置找到约束来源

    JSON Schema 校验 报告同时展示实例路径与 Schema 路径。/users/0/age 的类型错误指向实际值;required 失败可能指向父对象,缺失字段名需要结合参数查看,不能把父路径当作错误字段已经存在。

    数据树中的高亮节点连向另一棵规则树中的对应约束。

    保留拆分后的引用文件

    不必把公共定义全部粘进主 Schema。导入文件按根绝对 $id 注册,相对引用依据基 URI 解析。文件名只用于展示,不能代替标识符,也不会触发同名文件猜测。

    主规则卡片连接两份本地引用文件,并共同指向验证结果。

    把验证前提准备完整

    01

    版本声明和选择器保持一致

    默认版本为 2020-12。显式 $schema 与选择器冲突会报错,不会静默切换解释。Draft-07 的元组使用 items 数组,2020-12 使用 prefixItems;切换版本并不会迁移已有规则。

    02

    先单独检查规则文件

    只检查 Schema 会解析、元验证并编译主文件与全部导入依赖,不读取实例内容。每份引用文件需要唯一的绝对 $id,且不能包含 #。引用缺失会停止编译,不会跳过该约束继续通过。

    03

    修改后主动刷新结论

    手动校验支持 Ctrl/Cmd+Enter。修改输入、参数或引用会取消旧任务并禁用导出。示例替换、清空和删除引用先显示预览,应用后可以撤销一次,同时恢复输入与报告。

    契约判断的四个环节

    用所选方言执行真实规则

    JSON Schema 校验 通过 Ajv 执行 Draft-07、2019-09 和 2020-12。组合规则与条件分支按对应版本解释;未知关键字会导致编译失败,不会因拼写错误而悄悄少检查一项。

    格式断言由你明确开启

    JSON Schema 在线校验默认不执行 format。开启后使用 ajv-formats 内置规则检查 email、date-time、URI 和 UUID 等;未知格式会报编译错误。pattern 是独立约束,不受此开关控制。

    把规则错误和数据违约分开

    语法错误、无效 Schema、缺失引用和实例不满足约束对应不同阶段。JSON Schema 校验器只允许导出完成的报告;引擎技术解释保留英文原文,界面提供本地化状态和错误类别。

    结合路径与参数阅读报告

    引擎采用尽早失败策略,但组合分支仍可能产生多条错误。查看 instancePath、schemaPath、keyword 和参数;每次展示 50 条,下载的 JSON 包含完整获准生成的报告。

    先确认这些实际边界

    引用地址不是下载指令
    只解析文档内部引用和你导入的 Schema,不抓取远程 HTTP 内容。引用文件必须有不带 # 的根绝对 $id,重复标识符会报错;单独提供匹配的文件名不能解决引用。
    不强制转换或修复数据
    不会把字符串变成数字,不补 default,不删除额外属性。主文件、依赖和实例均拒绝 JSON5、注释、尾逗号与重复键,防止覆盖字段之后再给出误导性结论。
    有限支持范围,不执行扩展
    仅支持列出的三种版本。自定义元 Schema、$vocabulary、$async、$data 及未知关键字不受支持。需要提供兼容的 Schema 片段,不能将整份 OpenAPI 文档当作待验证规则。 采用 Ajv strictSchema 编译限制,缺少 if 的 then 等被忽略规则也可能拒绝。properties、patternProperties、dependencies 映射中精确名为 __proto__ 的键不受支持,以免引擎跳过;实例中的同名键不受此限制。
    数值并非任意精度
    非有限值、不安全的数学整数,以及转换为 Number 后十进制值改变的数值会被拒绝;1.0 与 1e0 等等值写法允许使用。普通小数仍采用 IEEE 754,multipleOf 可能遇到浮点边界,不能承诺任意精度计算。
    输入大小与运行时间有限
    每文档上限为 500,000 字符、50,000 节点和 40 层,全部输入共 1,000,000 字符,最多 10 份引用文件。运行超过 5 秒会终止任务;超时代表未完成,并非数据有效或无效。
    报告不穷举全部问题
    allErrors 关闭,需要修正已报告问题后重跑。一份通过的样例也不能证明未来所有数据正确。报告最多 1,000 条错误和 500,000 字符,超出预算整体失败,不截断后仍给出判断。

    JSON Schema 校验 常见问题

    Draft 7、2019-09 和 2020-12 应该怎么选?

    跟随 Schema 根部 $schema 声明,并与选择器保持一致。已有系统使用哪个版本就选择哪个版本;新规则默认采用 2020-12。元组、动态引用等语义存在差异,改下拉框并不能升级规则内容。

    校验错误的 path 该怎么看?

    path 使用 JSON Pointer,例如 /items/0/name 指向 items 数组首项的 name。空字符串表示根,单独的 / 则指向空名称键,不能混为一谈。schemaPath 指出触发错误的规则位置。

    为什么缺少 required 字段的错误指向父对象?

    缺失字段没有实际值可指向,因此 Ajv 的 instancePath 通常定位它应当所在的父对象。结合 params 中的 missingProperty 找字段名,不能只看父路径就去修改整个对象的类型。

    additionalProperties 为 false 时为什么报错?

    false 会拒绝未被同一规则上下文中的 properties 或 patternProperties 接受的键。确认是不是拼写错误或有意新增字段,再决定修改数据还是允许该属性;工具不会替你删除它。

    email、date 这些 format 是否参与校验?

    默认不校验。启用格式选项后才执行 ajv-formats 支持的检查,未知格式会导致编译失败。format 不代替 type;检查邮箱字符串时应同时声明字符串类型,pattern 则始终按规则执行。

    遇到了需要复核的约束?

    再检查一份边界样例

    使用 JSON Schema 校验 对照正常与失败样例,并在审阅导出报告时记录 draft 和 format 设置,避免不同环境的选项差异改变结论。