JSON Schema
新功能 — Zod 4 引入了一个新特性:原生的 JSON Schema 转换。JSON Schema 是一种用于描述 JSON 结构的标准(使用 JSON 本身)。它广泛应用于 OpenAPI 定义和为 AI 定义结构化输出。
z.fromJSONSchema()
实验性 — z.fromJSONSchema() 函数是实验性 API,不属于 Zod 稳定接口。未来版本中可能会有实现上的变化。
Zod 提供了 z.fromJSONSchema() 用于将 JSON Schema 转换为 Zod schema。
z.toJSONSchema()
要将 Zod schema 转换为 JSON Schema,请使用 z.toJSONSchema() 函数。
所有的 schema 和校验都会被转换为其最接近的 JSON Schema 等价形式。有些类型没有对应的表示,无法合理地表达。有关处理这类情况的更多信息,请参见下面的 unrepresentable 部分。
配置
第二个参数可用于自定义转换逻辑。
下面是每个支持参数的快速参考。每项参数在下文有更详细的说明。
io
某些 schema 类型的输入和输出类型不同,例如 ZodPipe、ZodDefault 和强制类型转换的基本类型。默认情况下,z.toJSONSchema 生成的是 输出类型;使用 "io": "input" 来生成输入类型。
target
要设置目标 JSON Schema 版本,使用 target 参数。默认情况下,Zod 目标版本为 Draft 2020-12。
metadata
如果还没有,请先阅读 元数据和注册表 页面,了解在 Zod 中存储元数据的背景。
在 Zod 中,元数据存储在注册表中。Zod 导出一个全局注册表 z.globalRegistry,可用于存储常用的元数据字段,如 id、title、description 和 examples。
所有的元数据字段都会被复制到生成的 JSON Schema 中。
unrepresentable
以下 API 在 JSON Schema 中无法表示。默认情况下,Zod 遇到它们会抛出错误。尝试将它们转换为 JSON Schema 是不合理的;你应该修改你的 schemas,因为它们在 JSON 中没有等价物。遇到任一类型都会抛出错误。
默认情况下,Zod 遇到它们会抛出错误。
你可以通过设置 unrepresentable 选项为 "any" 来改变此行为。这会将所有不可表示的类型转换为 {}(JSON Schema 中等价于 unknown)。
cycles
如何处理循环引用。当 z.toJSONSchema() 遍历 schema 发现循环时,会使用 $ref 来表示。
如果想遇到循环时报错,可以将 cycles 选项设置为 "throw"。
reused
如何处理在同一 schema 中多次出现的 schemas。默认情况下,Zod 会将它们内联。
你也可以将 reused 选项设置为 "ref",将这些 schema 抽取为 $defs。
override
要定义自定义的覆盖逻辑,使用 override。传入的回调可以访问原始 Zod schema 和默认的 JSON Schema。该函数应直接修改 ctx.jsonSchema。
注意,不可表示类型会在该函数调用之前抛出 Error。如果你想为不可表示类型定义自定义行为,需要同时设置 unrepresentable: "any" 并使用 override。
转换细节
以下是与 Zod JSON Schema 转换逻辑相关的额外细节。
字符串格式
Zod 会将以下 schema 类型转换为等价的 JSON Schema format:
这些 schema 通过 contentEncoding 支持:
所有其他字符串格式通过 pattern 支持:
数值类型
Zod 将以下数值类型转换为 JSON Schema:
对象 schema
默认情况下,z.object() schema 包含 additionalProperties: false。这准确表示了 Zod 的默认行为,因为普通的 z.object() schema 会剥离额外属性。
在以 "input" 模式转换为 JSON Schema 时,additionalProperties 不会被设置。更多内容参考 io 文档。
相比之下:
z.looseObject()永远不会 设置additionalProperties: falsez.strictObject()总是 设置additionalProperties: false
文件 schema
Zod 将 z.file() 转换为以下符合 OpenAPI 的 schema:
大小和 MIME 类型校验也会被表示:
可空性
Zod 将 z.null() 在 JSON Schema 中都转换为 { type: "null" }。
注意,z.undefined() 在 JSON Schema 中是不可表示的(见下文不可表示部分)。
类似地,nullable 通过与 null 的联合表示:
可选的 schema 则按原样表示,同时附带一个 optional 注解。
注册表
将 schema 传给 z.toJSONSchema() 会返回一个自包含的 JSON Schema。
在其他情况下,您可能有一组 Zod 模式,希望使用多个相互关联的 JSON 模式来表示,可能是为了写入 .json 文件并从 Web 服务器提供服务。
要实现这一点,您可以将一个 注册表 传递给 z.toJSONSchema()。
重要 — 所有模式都应该在注册表中注册 id 属性!任何没有 id 的模式将被忽略。
默认情况下,$ref URI 是简单的相对路径,如 "User"。要将这些转换为绝对 URI,请使用 uri 选项。这需要一个将 id 转换为完全合格 URI 的函数。

