@ag-kit/zod-to-json-schema

中文文档
3.24.6发布于 2025/11/03ISCTypeScriptESM + CJS零依赖近 30 天下载 1831

将 Zod 计划转换为 Json Schemas

中文使用文档
文档目录15 节
  1. 内容提要
  2. 发起人
  3. 使用量
  4. 基本实例
  5. 选项
  6. Schema 名称
  7. 选项对象
  8. 定义
  9. 错误消息
  10. 其他属性
  11. override
  12. postProcess
  13. 已知问题
  14. 版本
  15. 更改日志

佐德呼叫杰森·斯克马

NPM Version NPM Downloads

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

内容提要

做它所说的锡; 转换 Zod 计划 输入 JSON 计划来啊!

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

发起人

非常感谢我们的赞助商! 请考虑通过我的 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
}

已知问题

  • 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

版本与发布记录

@ag-kit/zod-to-json-schema 共发布 1 个版本,首次发布于 2025/11/03;过去 12 个月发布了 0 个版本。

版本发布日期距今
3.24.6latest2025/11/031 年前

关于 @ag-kit/zod-to-json-schema 的常见问题

@ag-kit/zod-to-json-schema 是什么?

将 Zod 计划转换为 Json Schemas

如何安装 @ag-kit/zod-to-json-schema?

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

@ag-kit/zod-to-json-schema 支持 TypeScript 吗?

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

@ag-kit/zod-to-json-schema 支持 ESM 还是 CommonJS?

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

@ag-kit/zod-to-json-schema 可以商用吗?

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

@ag-kit/zod-to-json-schema 的下载量有多少?

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

@ag-kit/zod-to-json-schema 还在维护吗?

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