JSON Schema 校验与推断
JSON Schema 是用 JSON 写的「这份 JSON 应该长什么样」。接口契约、配置文件校验、表单规则都在用它。这里两件事都能做:拿 Schema 校验数据,错在哪一层、为什么错,逐条列出来;或者反过来,丢一份样例 JSON 进去,先生成一份 Schema 骨架再手工收紧。
支持的关键字
| 关键字 | 说明 |
|---|---|
| type | object / array / string / number / integer / boolean / null,也可以写成数组表示「几种之一」 |
| properties | 对象各字段的子 Schema |
| required | 必须存在的字段名列表 |
| additionalProperties | 为 false 时,出现 properties 之外的字段就算错 |
| items | 数组元素的 Schema;写成数组则按位置一一对应 |
| minItems / maxItems / uniqueItems | 数组长度与元素唯一性 |
| minimum / maximum | 数值范围,配套的 exclusiveMinimum / exclusiveMaximum 也支持 |
| multipleOf | 必须是某个数的整数倍 |
| minLength / maxLength / pattern | 字符串长度与正则 |
| format | email / uri / ipv4 / ipv6 / date / date-time / uuid / hostname |
| enum / const | 取值必须在列表里 / 必须等于某个固定值 |
| anyOf / oneOf / allOf / not | 组合条件 |
| $ref | 只支持指向本文档内部的 #/definitions/xxx 这类引用,不会去网上拉 |
按 draft-07 的语义实现,覆盖日常够用的那一批。$id、if/then/else、跨文档 $ref、contentEncoding 这些不支持,真要跑完整规范请用 Ajv 之类的库。
推断出来的 Schema 怎么用
- 它是起点,不是终点
- 推断只能看见样例里出现过的东西。样例里
status永远是"ok",推断不出它还能是"fail";样例里数组只有一个元素,也推断不出第二个元素可能缺字段。生成完一定要手工过一遍,把范围、必填、枚举收紧。 - 多丢几份样例进去
- 把几份代表性的响应(成功、失败、空列表、字段缺失)分别推断一次,再把结果并起来,比只看一份准得多。
- null 是个坑
- 样例里某字段是
null,推断出的 type 就只有"null"。实际多半应该是["string","null"],需要手工改。 - 相关工具
- JSON 格式化、JSONPath 测试、JSON 结构处理、JSON 转代码、测试数据生成。