JSON Schema 生成与校验
由样本推断 Draft 2020-12 Schema,再拿它校验实例并列出错误路径。
生成模式对标 quicktype 的 schema 输出:合并多份样本后产出 Draft 2020-12 文档,可复用的对象结构收进 $defs 并用 #/$defs/名字 引用。校验模式是自研的 Draft 2020-12 子集校验器,不依赖 ajv,改任一侧文本都即时重算。
两边都不超出样本与已实现的子集:required 只列在每一份样本里都出现过的键,缺一次就降级为可选;format 只在字符串形状高度一致时猜测,取 date、date-time、uuid、email、uri 五种,宁缺毋滥;数值与字符串的最小/最大值只作为观察值写进 x-observed 扩展注记,不会伪造成 minimum/maxLength 约束,additionalProperties 默认保持 true。校验器实现了 25 个关键字,uniqueItems、contains、if/then/else、dependent*、propertyNames、min/maxProperties、unevaluated*、content*、$id/$anchor/$dynamic* 都在不支持之列,遇到外部 URL 的 $ref 会明确拒绝而不是跳过。
JSON Schema 生成与校验怎么用
- 生成:顶部两组按钮先选「从样例生成 Schema」,在「JSON 样本」栏按空行分隔贴入若干样本,右栏即时给出 Draft 2020-12 文档;折叠区里逐条写着 required、format 和观察值的判断依据,标题会跟着本轮的实际产出变化。输出的 $schema 固定写 https://json-schema.org/draft/2020-12/schema;同一字段样本间类型不同会写成类型数组(如 ["string","null"]),而不是挑一个;数组 items 取全部元素的类型并集,全空数组写成 items: true 并在说明里点明;additionalProperties 默认保持 true 并给出说明,只有你确认对象是封闭结构时才手动改成 false。
- 校验:切到「Schema 校验」,三栏分别是 Schema、实例 JSON、校验结论,改任一侧文本都即时重算。实例栏标根类型,结论栏标「通过」或「N 条错误」(最多列 200 条,超出会点明),每条错误给出「实例位置 / Schema 位置 / 说明」两列 JSON Pointer(~0 转义 ~、~1 转义 /)加一句人话,例如 /no 对 #/properties/no/pattern。任何一侧解析不成 JSON 时不猜结果,结论栏直接写「未校验」并在横幅说明是哪一侧坏了。Schema 那栏的标题会实时写「关键字全部已实现」或者「N 个关键字被忽略」,N 只数真正处在关键字位置的键——properties 下面那些键名是实例的键名,不会被误报成关键字。
- 下载:生成模式下点「下载 schema.json」,走浏览器本地 Blob,不会发起任何网络请求;校验模式没有下载按钮,错误表请自行选中复制——本页没有复制按钮。
- 支持的 25 个关键字:type、enum、const、required、properties、additionalProperties、patternProperties、items、prefixItems、minItems、maxItems、minimum、maximum、exclusiveMinimum、exclusiveMaximum、multipleOf、minLength、maxLength、pattern、format(仅断言已知的五种,未知 format 直接放行)、allOf/anyOf/oneOf/not,以及只允许同文档指针的 $ref(#/$defs/...)。完整清单和判断依据收在「支持 25 个关键字 / 不支持 23 类」那条折叠区里。
常见问题
format 到底会不会拦截?
分两件事。生成时 format 只是"形状像"的注记,不是约束;校验时按 Draft 2020-12 的默认口径做断言:date、date-time、time、email、uuid、uri 这六种有校验规则(email/uuid/uri 只做结构粗检,不做 DNS 或 SMTP 级验证),其余格式的写法一律放行。想要 format 严格生效或完全忽略,应在代码层用专门的库二次校验。
$ref 为什么不能引外部 URL?
取外部文档要靠 fetch,而这个页面的铁律是粘贴的数据绝不离开浏览器,所以校验器只接受以 # 开头的同文档 JSON Pointer(如 #/$defs/user),外部 $ref 和 #anchor 锚点会报错提示。替代做法:把被引文档的内容手动合进 $defs 再改指针,或删掉外部引用只保留本地结构。
生成的 schema 为什么带 observed 值?
那是 x-observed 注记,记录样本里见过的最小/最大值和长度范围,供人参考。它们不是约束:样本里见过 3 次 100 不代表业务上限是 100,校验器不认识 x- 开头的扩展关键字,也不会因此判错。确认这些范围就是业务规则时,手动把它们抄写成 minimum/maximum/maxLength。
对应功能编号 #106无需安装,手机端同样可用按 Ctrl + K 换工具