实用工具

JSON 转 Zod Schema

从样本 JSON 生成 Zod schema,同一份结构既能在运行时校验,又能推导出 TypeScript 类型。

浏览器本地运行代码转换1.4万
免费

输入

0 B

结果

结果会显示在这里。

TypeScript 类型编译后就没了,而 Zod schema 在响应真正到达时依然存在,用 z.infer 还能反推出类型。这里用 quicktype 的 typescript-zod 生成器从样本生成 schema:按 Zod 4 推荐的写法 import * as z from "zod" 引入,每种对象结构一个 schema,并在旁边导出推导出的类型。我们的测试会在 zod 4 下实际运行生成的代码,确认它能校验通过生成它的那份样本——这是生成的 schema 起码该做到的。

它是怎么工作的

  • 数组里部分元素缺失的键生成 .optional(),有时为 null 的键生成与 z.null() 的联合。
  • schema 按依赖顺序输出,每个嵌套 schema 都声明在引用它的对象 schema 之前。
  • 打开日期识别后,ISO 时间戳生成 z.coerce.date(),解析时会把字符串转成 Date;关掉则保持 z.string()。
  • 生成的都是普通的 z.object,解析时会丢弃未知键;需要别的行为就手动改成 z.strictObject 或 z.looseObject。

你的数据去了哪里

哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。

本工具免费且无需登录,运行结果只存在于你当前的页面里,不会被保存到任何地方。

它要花多少

本工具完全免费,不需要登录,也不消耗积分。

常见问题

生成的代码能用在 Zod 3 上吗?
可以。用到的 z.object、z.array、z.union、z.null、.optional() 和 z.coerce.date() 在两个大版本里都有,命名空间导入的写法在 3.x 也能用。两个版本的差别在错误信息格式和一些高级 API 上,生成的代码都没有涉及。
为什么顶层 schema 是另一个 schema 的数组?
因为样本本身是数组。元素的结构有自己的 schema(示例数据里是 RepoElementSchema),顶层名字用在数组上,所以同一份文件既能校验单个元素,也能校验整个列表。
生成的 schema 有多严格?
和样本一样严格,也就是不太严格。字符串字段接受任意字符串,而不只是你贴的那些值;数字不管是不是整数都是 z.number()。之后可以按接口约定用 .int()、z.url()、z.email() 或 z.enum() 收紧,一份样本表达不了这些约束。

背后的开源项目

本工具运行在 glideapps/quicktype 之上,以 Apache-2.0 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。

glideapps/quicktype

也常被称作

  • json转zod
  • zod schema生成
  • json生成zod
  • zod在线
  • typescript运行时校验
  • zod v4