JSON 模式生成器

粘贴一个或多个 JSON 样本,生成器便会推断出可用于校验新载荷的 JSON 模式。它能识别类型,将出现在所有样本中的字段标记为必填,在取值来自一个较小的封闭集合时推断枚举(enum),并生成符合 JSON 模式 draft 2020-12 的输出。

如何生成 JSON 模式

  1. 1

    粘贴示例文档

    一个或多个真实载荷,种类越丰富,推断出的模式就越精确。

  2. 2

    选择草案

    draft 2020-12(现行)、draft 07(广泛支持)或 draft 04(用于旧版 OpenAPI)。

  3. 3

    调整推断

    切换枚举推断、必填字段策略(交集与并集),以及仅提供单个样本时是否将所有字段标记为 `required`。

  4. 4

    生成

    模式将连同 `$schema`、`title`、`type`、`properties` 一起输出,并为重复出现的子对象生成嵌套的 `$ref`。

推断擅长处理的内容

  • 类型:string、number、integer、boolean、null、array、object。
  • 可空性:某字段在一个样本中为 null、在另一个样本中为字符串时,会变为 ["string", "null"]
  • 数组元素:同构数组生成单个 items 模式;异构数组生成 prefixItems
  • 枚举(enum):若所有观测值都来自一个较小的集合(可配置,默认 10 个不同的值),则输出 enum
  • 必填:存在多个样本时,键的交集成为 required;只有一个样本时,除非你选择不这样做,否则所有键都为必填。
  • 格式:与 ISO-8601 日期、电子邮件或 URI 相匹配的字符串会被推断出 format

推断无法得知的内容

  • 意图与示例之别:样本 age: 25 会推断出 type: integer,但无法得知你是否也接受 null。请提供覆盖边界情况的多个样本。
  • 约束minLengthmaximumpattern,这些需要你手动添加。推断不会从样本中猜测取值范围。
  • 业务逻辑:“这三个字段中必须恰好设置一个”需要用 oneOf 表达,无法推断。
  • 引用:生成器输出扁平的模式。若想把重复的结构抽取到 $defs 中,请在生成之后再做。

输出示例

从单个样本:

{ "name": "Alice", "age": 30, "tags": ["admin", "user"] }

推断出的模式(draft 2020-12):

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "required": ["name", "age", "tags"]
}

常见错误

  • 仅从单个样本推断。 模式会过拟合,每个字段都变为必填,且不容忍 null。请始终提供至少 5 到 10 个多样化的样本。
  • 想要 number 时却用了 integer 若任一样本含有小数,推断类型会变为 number;若全部为整数,则为 integer。对于两者皆可的字段,请包含一个含小数的样本。
  • 遗漏可选字段。 在 5 个样本中有 4 个包含、1 个缺失的字段会被视为可选,这是有意的。若 5 个样本恰好都包含它,即便它在你的 API 中其实是可选的,模式也会将其标记为必填。

常见问题

样本越多越好,但通常 5 到 10 个多样化的样本即可生成合理的模式。只用一个样本时,每个字段都会变为必填,且无法推断可空性,如有可能,请始终提供多种变体。

默认使用 draft 2020-12。为兼容 OpenAPI 3.0(其使用 draft 05/07 的子集),也提供 draft 07 和 draft 04。

不会。从样本中推断约束会导致模式过拟合。请在生成之后,根据你的业务规则手动添加 minLengthmaximumpattern 等。

可以。若你粘贴一个 JSON 数组,生成器会把每个元素当作独立样本,并生成描述单个元素(而非外层数组)的模式。若想得到外层数组本身的结构,请启用“作为数组容器处理”选项。

相关工具

此工具还提供其他语言版本