JSON Schema 生成器
从严格 JSON 样例推断可复核的起始 Schema
从一份 JSON 值推断 Draft 2020-12 或 Draft 7 起始 Schema。根数组仍生成数组 Schema;对象数组的字段综合到 items 中,缺失与 null 分开。只推断已观察类型,不推断业务范围、格式或条件规则;空数组的 items={} 表示类型未知。
严格 JSON:拒绝重复键及会改变数值的转换;安全整数范围 ±9007199254740991,小数必须可等值回写,负零不支持。输入 ≤2 MiB,深度 ≤128,值总数 ≤100000,输出 ≤8 MiB。路径 ≤8192 字符,查询 ≤10000 条,数组索引 0–99999。
在当前页面本地处理,不保存 JSON 或路径草稿,不执行查询脚本,不把键名、路径或值发送到统计服务。
工具说明
从严格 JSON 值推断 Draft 2020-12 或 Draft 7 起始 Schema。根数组仍生成数组 Schema,对象样例综合到 items,不把缺失键混同为 null 或继承属性。整数与非整数并存时合并为 number,可空字段用类型联合,异构项用 anyOf。可以要求每个样例都有的键、所有观察到的键,或不生成 required;也可以加入基础值示例、用 additionalProperties: false 禁止额外字段。特殊键会保留,__proto__ 另带精确键名模式以兼容验证器。空数组的 items 不限制类型。推断无法发现业务格式、范围、唯一性或条件规则;数值改变和重复键会在推断前被拒绝。输入最多 2 MiB,输出最多 8 MiB,不保存输入草稿。
场景配方
区分缺失属性与显式 null 属性
目标:生成起始契约时保留可选字段的有限证据。
- 输入 [{"id":1,"note":null},{"id":2}],选择 Draft 2020-12 和“每个对象样本都有”,关闭基础值示例与禁止额外字段。
- 生成后检查 items.properties:id 为 integer,note 为 null;items.required 只包含 id。
- 验证两条原始记录,并用 id: "2" 的无效记录反证。仅在确认 API 允许后,再给 note 增加 string 分支。
结果:数组 Schema 保留可选、目前只观察到 null 的 note。缺失 note 不表示字符串类型,也不要求该属性存在。
失败门诊(高频踩坑)
生成的契约拒绝缺字段的原记录
原因:“所有出现过的字段”会要求所有已观察键,包括部分记录中不存在的字段。关闭对象也会拒绝未来未观察到的新字段。
修复:需要原样本通过时使用默认的“每个对象样本都有”。更严格的 required 和关闭对象规则应有明确意图,并同时测试完整与缺字段记录。
Schema 表达了超过样本证据的确定性
原因:空数组无法提供项目类型;仅有 null 的字段无法提供非 null 类型。一份样本也不能确定格式、范围或未观察到的分支。
修复:让空数组的 items 保持不限制,补充代表性样本,再单独复核业务约束。精确大整数 ID 应先使用字符串,不要为让工具运行而把被拒绝的数字舍入。
生产可用片段
一条缺少 note、一条显式为 null 时的预期 Schema
json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "integer" },
"note": { "type": "null" }
},
"required": ["id"]
}
}常见问题
支持哪些 Draft 和根值?
可选择 Draft 2020-12 或 Draft 7,支持对象、数组和标量。记录数组生成 type: array 与推断的 items,不会悄悄变成单条记录的 Schema。
如何处理缺失字段、null 与 required?
缺失键不提供类型证据,显式 null 会提供。默认仅要求每个对象样例都有的键;选择所有出现过的键可能使缺字段的原记录无法通过,这是刻意加严;选择不生成则省略 required。
混合数字和数组如何推断?
整数与非整数合并为 number。单一非 null 类型与 null 使用类型联合,多种不同类型使用 anyOf。对象样例综合属性;空数组使用 items: {},表示项目类型未知。
__proto__ 和 constructor 会作为真实 JSON 键吗?
会,只有对象自己的键提供数据。__proto__ 保留于 properties,并增加精确键名模式,因为包括 Ajv 8 在内的部分验证器会跳过 properties 下的该名称。关闭额外字段时也能保留其约束。
生成结果能完整描述 API 契约吗?
不能。它无法推断未观察到的类型、格式、范围、模式、唯一性或条件规则。additionalProperties: false 是可选的明确限制。采用契约前应同时核验应通过和应失败的样例。
解析会拒绝什么,输入会保存吗?
重复的解码键、负零、不安全整数、上溢、下溢和回写时会改变的小数会被拒绝。精确标识请用字符串。输入最多 2 MiB、128 层、100000 个值,输出最多 8 MiB。本地处理,不保存 JSON 草稿,统计不含源值。
继续浏览