@alcyone-labs/zod-to-json-schema

中文文档
4.0.10发布于 2025/07/25ISCTypeScriptESM + CJS零依赖近 30 天下载 16.3万

将 Zod schemas 转换为 Json Schemas (升级为 Zod V4)

中文使用文档
文档目录25 节
  1. 内容提要
  2. Zod 版本兼容性
  3. Zod V4 支持 {}
  4. 后向兼容性
  5. 发起人
  6. 使用量
  7. 基本实例
  8. 选项
  9. Schema 名称
  10. 选项对象
  11. 定义
  12. 错误消息
  13. 其他属性
  14. override
  15. postProcess
  16. 移徙指南:Zod V3 → V4
  17. 字符串验证更改
  18. 对象Schema 更改
  19. 错误信件更改
  20. 删除 API 的变通工作
  21. 要意识到的其他更改
  22. 移徙援助人员
  23. 已知问题
  24. 版本
  25. 更改日志

佐德呼叫杰森·斯克马

NPM Version NPM Downloads

寻找完全相反的(Zod V3)? 检查出来 json-schema- to- zod (韩语)

内容提要

说明: 这是升级到Zod V4的叉子

做它所说的锡; 转换 Zod 计划 V4 进入 JSON 计划虽然佐德 现在在本地支持JSON Schemas有些人还需要更新版的图书馆 所以在这里.

  • 支持所有相关的策略类型,基本字符串,数字和数组长度验证和字符串模式.
  • 解决内部的递归和反复出现的计划 $ref编号.
  • 支持针对遗产的Open API 3.0规格(3.1支持常规Json Schema).
  • 支持 Open AI 严格的模式方案(可选对象属性被需要但无效的属性所取代).

Zod 版本兼容性

这个图书馆是 完全兼容 Zod V4 并保持与大多数Zod V3模式的后向兼容.

Zod V4 支持 {}

  • 完全兼容 与 Zod V4 新的内部结构
  • 错误消息 完全支持 V4 的新错误系统
  • 所有验证类型 工作(字符串、数字、对象、阵列、联盟等)
  • 元数据和说明 完全支持
  • 参考资料处理 为 V4 的系统结构进行了优化

后向兼容性

大多数 Zod V3 代码不会改变 与这个图书馆和Zod V4. 主要例外有:

打破 Zod V3 更改 → V4

一些Zod V3 API在V4中被移除. 以下是变化和如何迁移:

删除字符串方法( 断开)

  • ❌ z.string().ip() • 使用 z.string().ipv4() 或者说 z.string().ipv6() 或者说 z.union([z.string().ipv4(), z.string().ipv6()])
  • ❌ z.string().cidr() • 使用 z.string().cidrv4() 或者说 z.string().cidrv6()

已贬值但仍得到支持(不突破)

  • z.string().email() 偏爱 z.email() (顶级API)
  • z.object().strict() 偏爱 z.strictObject()
  • z.object().passthrough() 偏爱 z.looseObject()
  • z.string().min(5, { message: "..." }) 偏爱 z.string().min(5, { error: "..." })

所有被贬损的方法仍然有效,但可能在未来的Zod版本被去掉.

发起人

非常感谢我们的赞助商! 请考虑通过我的 GitHub 赞助页面每一分钱都有帮助,但这些家伙确实超越了..


将代码审查时间和错误减半( B)
密码兔子.ai

stainless
构建 AI 应用程序和工作流程 重装AI工具
retool.com (英语)

使用量

基本实例

import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";

const mySchema = z
  .object({
    myString: z.string().min(5),
    myUnion: z.union([z.number(), z.boolean()]),
  })
  .describe("My neat object schema");

const jsonSchema = zodToJsonSchema(mySchema, "mySchema");

预期产出

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "#/definitions/mySchema",
  "definitions": {
    "mySchema": {
      "description": "My neat object schema",
      "type": "object",
      "properties": {
        "myString": {
          "type": "string",
          "minLength": 5
        },
        "myUnion": {
          "type": ["number", "boolean"]
        }
      },
      "additionalProperties": false,
      "required": ["myString", "myUnion"]
    }
  }
}

选项

Schema 名称

可以通过一个字符串作为主zodToJsonSchema函数的第二个参数. 如果您这样做, 您的计画将最终在定义中 对象属性在根上并从中引用 。 或者,你可以通过名称作为 name 选项对象的属性(见下文).

选项对象

而不是计划名称(或无),你可以通过一个选项对象作为第二个参数. 有以下备选方案:

选项效果
名称? 字符串如上所说.
名称战略"ref" \"标题"添加名称为"title" meta, 而不是如上所述作为参考
基盘: 字符串 []根参考构建器的基础路径. 默认为 ["#"].
战略"根""根""相""相""相""相""相""相""相"参考构建者战略;
  • "根"(根) 解决从根起的$refs, e:"#/定义/mySchema".
  • "相对的" 用途 相对 JSON 指针。 。 。 . 看到已知的问题了!
  • "见" 重复任何"见"Zod schema的输出. 在理论上,它是"无"的更能表现的版本,但在实践中,这种行为会给被窝住的计谋带来问题,现在有了自己的选择.
  • 没有 忽略了所有引用, 创建一个新的 schema 分支, 甚至在 " Seen" schemas上。 递归引用默认为"Any", ie {}。 。 。 .
默认为"根".
效果战略"输入" \"任何"效果产出战略。 默认"输入". 看到已知的问题了!
日期战略?:"format:date""format:date-time""弦""整数"日期策略,整数允许在unix-time分秒和最大值中指定. "format:date"创建了有格式的字符串计划:"date". "format:date-time"创建了有格式的字符串计划:"date-time". "字符串"被编为"format:date-time". “ 整数” 创建了带有“ unix- time” 格式的整数计划( 除非目标“ open Api3” 也被尊重 )
电子邮件战略?: “格式: 电子邮件” qq“格式: idn- 电子邮件” qq“ pattern: zod”选择如何处理电子邮件字符串检查 。 默认为"format:email".
基础64 战略?: “格式: 二进制” =====================================================================================================================================================================================================================================================选择如何处理 Base64 字符串检查 。 默认为描述的“ 内容编码: base64 ” 这里,注意"format:binary"在输出类型中没有表示,因为它不是JSON Schema spec的一部分,而只是打算在瞄准OpenAPI 3.0时使用. 后来版本的OpenAPI支持内容Encoding.
定义:"定义""$defs"名称传递时定义属性的名称 。 默认为"定义".
目标:"jsonSchema7" "jsonSchema2019-09" "开Api3" "开Ai"目标是哪个 默认为"jsonSchema7"
严格*:布尔任何类似Json计划的工会 {} 或者说 true. 多种zod类型可能出于必要而产生这些类型,例如:z.intanceof()
定义?: 记录<字符串, ZodSchema>见下文单独一节
错误*:布尔包含通过链式函数检查为所支持的zod类型创建的自定义错误消息 。 见下文一节
缩放*:布尔副本 description 元为 markdownDescription
模式战略"逃出" \"保留"Zod 字符串验证 .includes(), (中文(简体) ), .startsWith(),以及 .endsWith() 必须与 JSON Schema 兼容 pattern。为了安全起见,所有非幽灵字符都是 escaped 默认(考虑) z.string().includes(".")),但这偶尔会给Unicode-flaggex regex解析器造成问题. 使用 preserve 来防止这种逃脱行为,并保留准确的字符串,即使它会导致不准确的正则克克.
应用Regex旗*:布尔杰森·斯克马 pattern 不支持 RegExp 旗帜,但Zod's z.string().regex() 已经 当此选项为真( 默认假) 时, 要将 regex 转换成旗下独立形式( 例如 ) . /x/i => /[xX]/ ) (中文(简体) ). 支持的旗帜 : i (只有基本拉丁语), m, (中文(简体) ), s。 。 。 .
管道战略"所有" "输入" "输出"决定使用时应包括哪些类型 z.pipe,例如 z.string().pipe(z.number()) 将会归还两个 string 财务报告和审定财务报表 number 默认,仅限 string 仅限输入 number 用于"输出".
额外战略:"通过" \"严格"决定何时 additionalProperties 应允许。 详情见关于其他属性的部分.
允许的额外财产? true | undefined给予什么价值 additionalProperties 当允许。 详情见关于其他属性的部分.
被拒绝的额外收益? false | undefined给予什么价值 additionalProperties 当被拒绝时。 详情见关于其他属性的部分.
覆盖*: 回调见节
后处理*: 回调见节
打开 AiAnyTypeName: 字符串决定一个用于允许Open AI结构输出中的半任意值的Json schema的名称. 如果Zod-schema中的任何值能解决任何“任何”类型的计划,它将参考这个名称的定义。 如果没有提供这种定义,将使用默认的Json计划。 默认为“ OpenAiAnyhType ”

定义

定义选项允许您在定义中手动添加重复的策略,用于更清洁的产出。 它与被命名的"计划",被更改的定义路径和基础路径完全相容. 这里有一个简单的例子:

const myRecurringSchema = z.string();
const myObjectSchema = z.object({ a: myRecurringSchema, b: myRecurringSchema });

const myJsonSchema = zodToJsonSchema(myObjectSchema, {
  definitions: { myRecurringSchema },
});

结果

{
  "type": "object",
  "properties": {
    "a": {
      "$ref": "#/definitions/myRecurringSchema"
    },
    "b": {
      "$ref": "#/definitions/myRecurringSchema"
    }
  },
  "definitions": {
    "myRecurringSchema": {
      "type": "string"
    }
  }
}

错误消息

此特性允许可选地包含通过链条函数创建的错误消息, 要求支持的zod类型 :

// string schema with additional chained function call checks
const EmailSchema = z.string().email("Invalid email").min(5, "Too short");

const jsonSchema = zodToJsonSchema(EmailSchema, { errorMessages: true });

结果

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "string",
  "format": "email",
  "minLength": 5,
  "errorMessage": {
    "format": "Invalid email",
    "minLength": "Too short"
  }
}

这样可以提供具体字段的、验证步骤的具体错误信息,这些错误信息可用于构建表格。 此格式为 react-hook-form'ajv 解析器(及其) ajv-errors 它用在引擎盖下。 注意如果使用此格式的 AJV 需要 启用 ajv-errors 由于 Vanilla AJV 默认不接受此格式.

自定义错误信件支持

  • ZodString 键盘
    • 正则
    • 分钟,最大
    • 电子邮件、 cuid、 uuid、 url
    • 结束于,起于
  • Zod 数字
    • 分钟,最大,它,lte,gt,gte,
    • 单位
    • 倍数
  • ZodSet 软件
    • 分钟,最大
  • 佐德阵列
    • 分钟,最大

其他属性

默认情况下,Zod在解析对象计划时会去除未申报属性. 为了复制此行为的预期输出, ZodToJsonSchema 的默认行为设置 "additionalProperties" 改为 false (虽然这一点的正确性可以辩论). 如果您希望允许未申报的属性,您也可以:

  • 设定 removeAdditionalStrategy 改为 "strict"。这将允许任何未以 .strict()。 。 。 .
  • 离开 removeAdditionalStrategy 设置为默认值 "passthrough",并添加 .passtrough() {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}去你的物体计划.

删除 additionalProperties 关键词使用 allowedAdditionalProperties 和(或) rejectedAdditionalProperties 选项.

一些计划定义(例如Google Gen AI API)不允许使用 additionalProperties 关键词。 幸运的是, JSON Schema 光谱允许这样做: 留下未定义的关键字 应 其效果与将其设定为真实(如通常的YMMV)相同. 要启用此行为, 请设置选项 allowedAdditionalProperties 改为 undefined。 。 。 .

将关键词排除在外,即使附加属性为 没有 允许,设置 rejectedAdditionalProperties 改为 undefined 还有.

注意 : 如果您的策略被宣布, 以上两个选项将被忽略 .catchall(...) ,因为所提供的计划将被取而代之(如果有效).

预期产出

z.object({}) + 选项"additionalProperties" 价值
.strip() (默认)false 如果战略是 "passtrough", (中文(简体) ), true 若为 "strict"
.passtrough()true
.strict()false
.catchall(z.string()){ "type": "string" }
.catchall(z.function())undefined (功能计划目前无法解析)

替换 true 财务报告和审定财务报表 false 页:1 undefined 根据 allowedAdditionalProperties 和(或) rejectedAdditionalProperties 页:1.

override

这个选项需要回调收到Zod schema定义,当前参考对象(包含当前 ref路径和其他选项),一个包含关于wether或未遇到的schema的推导的参数,以及一个强制解析参数.

重要的是: 如果您不想覆盖当前项目, 您必须返回 ignoreOverride 符号从索引导出。 这是因为 undefined 当您想要将财产排除在产生的 JSON 计划之外时, 是返回的有效选项.

import zodToJsonSchema, { ignoreOverride } from "zod-to-json-schema";

zodToJsonSchema(
  z.object({
    ignoreThis: z.string(),
    overrideThis: z.string(),
    removeThis: z.string(),
  }),
  {
    override: (def, refs) => {
      const path = refs.currentPath.join("/");

      if (path === "#/properties/overrideThis") {
        return {
          type: "integer",
        };
      }

      if (path === "#/properties/removeThis") {
        return undefined;
      }

      // Important! Do not return `undefined` or void unless you want to remove the property from the resulting schema completely.
      return ignoreOverride;
    },
  },
);

预期产出:

{
  "type": "object",
  "required": ["ignoreThis", "overrideThis"],
  "properties": {
    "ignoreThis": {
      "type": "string"
    },
    "overrideThis": {
      "type": "integer"
    }
  },
  "additionalProperties": false
}

postProcess

接受所有论据 override 调回, 调回 postProcess callback 也接收生成的 schema. 它应该总是返回 JSON Schema,或 undefined 如果你想过滤出来。 与 override 召回您无需返回 ignoreOverride 如果你对所制作的图案很满意,你只要不改变它.

import zodToJsonSchema, { PostProcessCallback } from "zod-to-json-schema";

// Define the callback to be used to process the output using the PostProcessCallback type:
const postProcess: PostProcessCallback = (
  // The original output produced by the package itself:
  jsonSchema,
  // The ZodSchema def used to produce the original schema:
  def,
  // The refs object containing the current path, passed options, etc.
  refs,
) => {
  if (!jsonSchema) {
    return jsonSchema;
  }

  // Try to expand description as JSON meta:
  if (jsonSchema.description) {
    try {
      jsonSchema = {
        ...jsonSchema,
        ...JSON.parse(jsonSchema.description),
      };
    } catch {}
  }

  // Make all numbers nullable:
  if ("type" in jsonSchema! && jsonSchema.type === "number") {
    jsonSchema.type = ["number", "null"];
  }

  // Add the refs path, just because
  (jsonSchema as any).path = refs.currentPath;

  return jsonSchema;
};

const jsonSchema = zodToJsonSchema(zodSchema, { postProcess });

使用 postProcess 包括实例和其他元a

添加对实例和其他 JSON Schema meta 密钥的支持是该项目最常用的功能。 不幸的是,目前的Zod主(3)对此有相当的厌足支持,因此需要一些用户地黑客. 由于这是一个很常见的用例,我加入了一个帮助器功能,它只是试图将任何描述分析成JSON,并扩展成由此而来的设计.

将您想要添加到输出图中的任意字符串作为描述, 然后导入和使用 jsonDescription 作为程序后选项 :

import zodToJsonSchema, { jsonDescription } from "zod-to-json-schema";

const zodSchema = z.string().describe(
  JSON.stringify({
    title: "My string",
    description: "My description",
    examples: ["Foo", "Bar"],
    whatever: 123,
  }),
);

const jsonSchema = zodToJsonSchema(zodSchema, {
  postProcess: jsonDescription,
});

预期产出:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "string",
  "title": "My string",
  "description": "My description",
  "examples": ["Foo", "Bar"],
  "whatever": 123
}

移徙指南:Zod V3 → V4

如果你从Zod V3升级到V4,这里需要做的是:

字符串验证更改

IP 地址验证

// ❌ Zod V3 (removed in V4)
z.string().ip();
z.string().ip("v4");
z.string().ip("v6");

// ✅ Zod V4
z.string().ipv4();
z.string().ipv6();
z.union([z.string().ipv4(), z.string().ipv6()]); // for both

CIDR 验证

// ❌ Zod V3 (removed in V4)
z.string().cidr();
z.string().cidr("v4");
z.string().cidr("v6");

// ✅ Zod V4
z.string().cidrv4();
z.string().cidrv6();
z.union([z.string().cidrv4(), z.string().cidrv6()]); // for both
// ✅ Zod V4 preferred (more tree-shakable)
z.email();
z.uuid();
z.url();
z.ipv4();
z.ipv6();

// ⚠️ Still works but deprecated
z.string().email();
z.string().uuid();
z.string().url();
z.string().ipv4();
z.string().ipv6();

对象Schema 更改

// ⚠️ Deprecated but still works
z.object({ name: z.string() }).strict();
z.object({ name: z.string() }).passthrough();

// ✅ Zod V4 preferred
z.strictObject({ name: z.string() });
z.looseObject({ name: z.string() });

错误信件更改

// ⚠️ Deprecated but still works
z.string().min(5, { message: "Too short" });

// ✅ Zod V4 preferred
z.string().min(5, { error: "Too short" });

删除 API 的变通工作

如果您需要支持 IPv4 和 IPv6 (替换旧的) .ip() 方法 :

// Create a reusable IP validator
const ipSchema = z.union([z.string().ipv4(), z.string().ipv6()]);

// Use in your schemas
const serverSchema = z.object({
  host: ipSchema,
  port: z.number(),
});

CIDR 范围:

const cidrSchema = z.union([z.string().cidrv4(), z.string().cidrv6()]);

要意识到的其他更改

UUID 验证为更严格

// Zod V4 is stricter about UUID format
z.string().uuid(); // Now validates against RFC 9562/4122

// For more permissive UUID-like validation:
z.string().guid(); // Accepts any 8-4-4-4-12 hex pattern

基数64URL 无更长时间允许铺设

// Zod V4 base64url is stricter (no padding allowed)
z.string().base64url(); // Must be unpadded

数量验证更改

// Safe integers only
z.number().int(); // Now only accepts safe integers
z.number().safe(); // Deprecated, behaves like .int()

// Recommended: Use the new top-level API
z.int(); // Preferred for integers

删除对象方法

// ❌ Removed in Zod V4
z.object().nonstrict(); // Use z.object() (default behavior)
z.object().deepPartial(); // No direct replacement (was anti-pattern)

// ⚠️ Deprecated but still works
z.object().strip(); // Use z.object() (default behavior)

移徙援助人员

为方便迁移,您可以创建这些辅助函数:

// Helper for IP validation (replaces old .ip() method)
export const ipAddress = () => z.union([z.string().ipv4(), z.string().ipv6()]);

// Helper for CIDR validation (replaces old .cidr() method)
export const cidrRange = () =>
  z.union([z.string().cidrv4(), z.string().cidrv6()]);

// Helper for flexible UUID validation
export const flexibleUuid = () => z.string().guid(); // More permissive than .uuid()

// Usage in your schemas
const networkSchema = z.object({
  serverIp: ipAddress(),
  allowedRange: cidrRange(),
  sessionId: flexibleUuid(),
});

已知问题

  • OpenAI目标目前应被视为实验性目标,因为一些选项的组合可能会打破相容性.
  • 使用时 .transform,返回类型从提供的函数中推断。 换句话说,返回类型没有计划,无法在运行时转换. 目前JSON schema因此会反映Zod schema的输入侧而不一定反映输出(后一aka. z.infer) (中文(简体) ). 如果这给您的方案造成问题, 请考虑使用效果策略“ 任何” , 它会允许任何类型的输出 .
  • JSON Schemas除了对象的字符串之外,不支持任何其他密钥类型. 使用时 z.record 如果有其他密钥类型,则此选项将被忽略。 这个规则的例外是 z.enum 自3.1.1.3起得到支持
  • 相对 JSON 指针, 同时发布 JSON计划草案 2020-12,在技术上不是它的一部分。 目前,大多数解决者根本不处理它们.
  • 自 v3 起, 对象解析器使用 .isOptional() 检查是否应将财产列入 required 或无. 这有潜在的危险行为 呼叫 .safeParse 与 undefined工作围绕,确保你 preprocess 和其他效果的回调是纯的,不会产生错误。 在Zod Repo中记录了一个问题,可以 追踪到这里。 。 。 .
  • JSON Schema 2020-12版本尚未被官方支持. 然而,您应该能够使用此库来获取2020-12年格式的相容计划,只需更改返回的计划 $schema 字段改为:“https://json-schema.org/draft/2020-12/schema#”

版本

这个包 没有 跟着语义版本。 这套软件包的主要版本和次要版本反映了与软件包的特征均等 Zod 软件包。 。 。 .

我将尽力将API突破式的改变保持在绝对最低,但新的特征可能出现为"patches",比如在3.9.1中引入了选项模式.

更改日志

https://github.com/StefanTerdell/zod-to-json-schema/blob/master/changelog.md 互联网档案馆的存檔,存档日期2014-12-21

版本与发布记录

@alcyone-labs/zod-to-json-schema 共发布 2 个版本,首次发布于 2025/07/25;过去 12 个月发布了 0 个版本。

版本发布日期距今
4.0.10latest2025/07/251.3 年前
4.0.52025/07/251.3 年前

关于 @alcyone-labs/zod-to-json-schema 的常见问题

@alcyone-labs/zod-to-json-schema 是什么?

将 Zod schemas 转换为 Json Schemas (升级为 Zod V4)

如何安装 @alcyone-labs/zod-to-json-schema?

在项目目录运行 npm install @alcyone-labs/zod-to-json-schema,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:zod(^4.0.5)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@alcyone-labs/zod-to-json-schema 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@alcyone-labs/zod-to-json-schema 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@alcyone-labs/zod-to-json-schema 可以商用吗?

@alcyone-labs/zod-to-json-schema 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@alcyone-labs/zod-to-json-schema 的下载量有多少?

根据 npm 官方下载统计,@alcyone-labs/zod-to-json-schema 在 2026/10/06 – 2026/11/04 这 30 天内被下载 162,605 次,日均约 5,420 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@alcyone-labs/zod-to-json-schema 还在维护吗?

最新版本 4.0.10 发布于 2025/07/25(1.3 年前);至今共发布 2 个版本,其中过去 12 个月发布了 0 个;首次发布于 2025/07/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。