JSC

JSON Schema 生成器

从严格 JSON 样例推断可复核的起始 Schema

JSON 与数据
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 Evan 维护•最近更新:2026年9月30日

从一份 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,不保存输入草稿。

场景配方

01

区分缺失属性与显式 null 属性

目标:生成起始契约时保留可选字段的有限证据。

  1. 输入 [{"id":1,"note":null},{"id":2}],选择 Draft 2020-12 和“每个对象样本都有”,关闭基础值示例与禁止额外字段。
  2. 生成后检查 items.properties:id 为 integer,note 为 null;items.required 只包含 id。
  3. 验证两条原始记录,并用 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 草稿,统计不含源值。

继续浏览