ZeroTool Workbench
JSON 转 Zod Schema
从 JSON 数据即时生成 Zod 验证 schema,支持嵌套对象、数组、nullable 字段和可选属性。完全在浏览器中运行。
使用方法
- 将 JSON 数据粘贴到左侧面板(或点击示例)。
- 设置根 Schema 名称(用于导出常量和类型)。
- 可选:启用严格模式以禁止多余字段。
- 点击生成 Zod Schema。
- 点击复制将结果粘贴到你的项目中。
输出格式
生成器输出完整的 TypeScript 代码片段,包括:
import { z } from “zod”— Zod 导入const FooSchema = z.object({…})— Schema 定义export type Foo = z.infer<typeof FooSchema>— 推断的 TypeScript 类型
常见使用场景
- API 验证:从 API 响应示例生成 schema,在运行时验证真实响应。
- 表单验证:将表单预期的数据结构转换为 Zod schema,用于 react-hook-form 等库。
- 配置文件:定义和验证从 JSON 文件加载的配置对象。
- 类型安全:与 TypeScript 结合,从单一 schema 同时获得运行时验证和静态类型推断。
示例
根名称填 User,输入:
{
"id": 42,
"email": "[email protected]",
"price": 19.9,
"tags": ["admin", "beta"],
"metadata": null,
"orders": [
{ "sku": "A1", "qty": 2 },
{ "sku": "B7", "qty": 1, "note": "gift" }
]
}
输出:
import { z } from "zod";
const UserSchema = z.object({
id: z.number().int(),
email: z.string(),
price: z.number(),
tags: z.array(z.string()),
metadata: z.null(),
orders: z.array(z.object({
sku: z.string(),
qty: z.number().int(),
note: z.string().optional(),
})),
});
export type User = z.infer<typeof UserSchema>;
两个订单里只有一个有 note,所以 note 是可选的。输出只用了 Zod 3 和 Zod 4 都支持的写法。
调整生成的 schema
样本里每个字段只有一个值,生成器不知道你的业务规则。使用前检查这几处:
| 生成结果 | 问题 | 改为(Zod 4) |
|---|---|---|
email: z.string() | 任意字符串都能通过 | z.email()(Zod 3:z.string().email()) |
qty: z.number().int() | 只有值一定是整数时才对。样本里 price: 10 也会得到 .int(),之后 10.5 会报 “expected int” | 价格用 z.number(),再加 .min(0) 或 .positive() |
metadata: z.null() | 只有 null 能通过 | z.string().nullable() |
status: z.string() | 任意字符串都能通过 | z.enum(["active", "inactive"]) |
| 样本里出现过的字段 | 一律必填,即使接口有时不返回 | 加 .optional() |
失败就应该停止运行的地方(如启动时读配置)用 .parse(),它会抛出 ZodError;接口响应和用户输入用 .safeParse(),它返回 { success: false, error },由你自己处理错误。
限制
- 类型只来自一份样本。 空数组生成
z.array(z.unknown()),空对象生成z.record(z.string(), z.unknown())。 null生成z.null()。 不会自动加.nullable()。在对象数组里,某个键在第一项是null、第二项是字符串时,生成z.union([z.null(), z.string()])。- 混合数组生成 union。
[{"a": 1}, 2]这样的数组,不论在根上还是在对象内部,都生成z.array(z.union([z.number().int(), z.object({ a: z.number().int() })]))。同一数组里的对象合并成一个z.object,所以 union 里只有一个对象成员。 - 没有字符串格式与范围。 邮箱、URL、日期、UUID 都是
z.string()。
FAQ
什么是 Zod?
Zod 是一个 TypeScript 优先的 schema 声明和验证库,让你定义数据结构并在运行时进行验证。广泛应用于 API 响应验证、表单验证和配置解析。
生成器如何推断类型?
生成器检查每个 JSON 值:字符串 → z.string(),布尔 → z.boolean(),整数 → z.number().int(),浮点 → z.number(),null → z.null(),数组 → z.array(),对象 → z.object()。对于对象数组,只在部分 item 中出现的 key 会被标记为 optional。
什么是严格模式?
启用严格模式后,每个 z.object() 后会追加 .strict(),Zod 会拒绝包含 schema 中未定义的多余字段的输入对象。不启用时,多余字段会被静默忽略(Zod 默认行为)。
生成的 schema 可以直接用于生产吗?
生成的 schema 是良好的起点,建议进一步审查和完善,例如为字符串和数字添加 .min()/.max() 约束,将 nullable 字段改为 .nullable().optional(),或将嵌套 schema 拆分为独立的命名常量。
我的 JSON 数据会发送到服务器吗?
不会。所有处理均在浏览器中完成,JSON 数据不会离开你的设备。