样本与契约

JSON Schema 生成器先看见差异,再确定约束

先运行对象示例。只有外层数组中的每一项都是独立文档时,才切换多样本模式。

JSON Schema 生成器

JSON 样本

Schema 输出

解析与生成在当前浏览器完成,样本不会上传或保存。

推断选项

样本不等于业务契约。全部必填可能拒绝缺项样本,枚举可能过度限制取值。

1 份样本 · 7 个属性 · 0 项枚举 · 省略 0 项枚举

JSON Schema 生成器适合只有接口响应、尚未形成字段文档的时候。某次请求恰好包含所有字段,并不代表以后也如此;把有缺项、空值或不同类型的记录放在一起,才能看到这份契约需要讨论的地方。

必填与可空不是同一项设置。属性存在但值为 null,仍满足 required;属性未出现,则不能靠允许 null 来通过必填检查。先理解这种区别,再决定哪些观察结果应成为正式规则。

为什么使用 JSON Schema 生成器

不要只看数组的第一项

JSON Schema 生成器会读取相同结构位置的全部数组元素。一条记录少了 tag,它就不再属于共同必填字段;另一条记录的 score 为 null,则把 null 合入类型。不同路径下的同名字段不会被混在一起。

两份记录汇入共同结构树;缺失字段变成虚线分支,空值保留为空心标记。

让人工补充的规则留得住

进入编辑模式后,自动生成会关闭。补充说明或约束后,再修改样本并生成,只会出现独立候选结果;确认替换一份 Schema 才应用。撤销会一起恢复原来的输入、参数和输出,方便比较修改前后的选择。

自动推断出的结构经过铅笔审阅,旁边显示独立候选稿和保留的原稿。

先确定样本的结构位置

01

辨认外层数组的含义

单文档模式把顶层数组作为真实数据结构,结果根类型仍是 array。多样本模式把外层数组拆成独立文档,因此适合合并几次接口响应;如果每份响应本来就是数组,应使用数组套数组。

02

分开确定字段存在与字段值

共同必填按同一位置的对象样本统计,不把 null 当成缺失。选择全部必填,会要求并集中所有字段,即使某份原样本缺少它。全部可空只扩大类型允许值,不会修改 required 列表。

03

改样本后重新审阅再导出

输入或参数变化会立即使结果过期并禁用复制与下载。自动生成等待 350 毫秒,关闭后可按 Ctrl/Cmd+Enter。手编结果重新生成需要先查看候选并应用;清空和载入示例也提供一次撤销。

推断时具体会做哪些判断

选择验证器支持的草案

JSON Schema 生成器提供 Draft 7、2019-09 和 2020-12。输出只使用三者共有的类型、属性、必填、枚举和普通 items 语法,所以这里的版本选择改变的是 $schema 声明,不会迁移已有复杂模式。

空数组不凭空补类型

嵌套数组的所有元素都参与合并,空数组只表示没有元素证据;全部为空时输出 items: {}。整数按数学值判断,1.0 与 100e-2 都是 integer,发现真正带小数的值后则合并为 number。

枚举需要主动选择

样本推断无法证明某个状态只有已经出现的几个值,因此枚举默认关闭。开启后,每个纯标量位置最多收集 20 个不同值;全部可空补入的 null 也计入上限。超过上限会整项省略 enum,并在状态中计数,不会悄悄截短值集合。

保留数值精度的 JSON 转 Schema

数值使用原始文本表示,超出安全整数范围也不会经过 JavaScript Number 四舍五入。1、1.0 与 1e0 按数学值去重并保留最先出现的写法。推断项可以直接编辑,之后只检查语法与根结构,不能代替完整模式验证。

样本无法证明的业务规则

不猜日期、长度或业务范围
字符串即使看起来像日期或邮箱,也保持 string;不会自动写入 format、pattern、最小最大值、长度或默认值。对象允许额外属性。将模式接入生产前,需要根据真实业务要求补充这些约束。
样本缺少的信息仍然未知
只观察到 null,不能推断它非空时是什么类型;只观察到空数组,不能推断元素结构。不同字段之间的关联与判别条件不会保留,因此合并模式可能允许样本中没有出现过的字段组合。
不生成固定位置元组
本工具统一合并全部数组元素,不提供只取第一项、固定长度或 tuple 模式。也不自动建立引用与条件分支。全部必填是一项主动收紧策略,可能使缺项的原样本不再符合结果。
手动编辑不代表语义已通过
编辑区接受对象或布尔模式,拒绝语法错误和重复键;但不会逐项核对元模式、读取外部引用或验证业务数据。例如拼错的类型名仍可能是合法 JSON,所以导出前还应使用匹配草案的验证器检查。
预算限制会停止整个生成
输入和输出各限 500,000 字符、50,000 个解析节点;输入嵌套最多 40 层,编辑输出最多 100 层。多样本接受 1–1,000 项。注释、尾逗号、NDJSON、文件导入和地址抓取不支持。生成结果超过预算时会报错,而不是给一份截断的模式。

JSON Schema 生成器常见问题

如何推断必填属性?

默认只有在同一位置的每个对象里都出现的字段才进入 required。显式 null 仍算出现。也可以选择全部必填或全部不必填,分别收紧或放宽字段存在条件。

如何处理 null 和混合值类型?

不同值类型在同一位置合并,null 作为真实类型保留。数字中只要出现非整数就使用 number。缺失字段只影响必填判断,不会自动变成 null。

可以使用什么样的 JSON 示例?

单文档模式接受对象、数组和标量根值;多样本模式要求非空外层数组,每项代表一个独立文档。示例按钮会根据当前模式载入相应数据。

会把数字精度、字符串长度写进 Schema 吗?

不会推断数字范围、字符串长度或精度约束。整数与小数类型会区分,枚举可选择开启,但样本中的最小最大值不能证明业务允许的边界。

uniform / first / all / tuple 四种数组模式怎么选?

本工具没有这四种模式切换,而是始终合并全部数组元素,生成统一 items。不会仅取首项,也不会把样本顺序猜成固定元组位置;需要位置约束时请手动补充并验证。

发现需要核对的推断结果?

把推断结果变成经过审查的契约

把正常记录与边界记录交给 JSON Schema 生成器,检查缺失字段、可空类型和枚举,再补充业务要求。