ZeroTool Workbench

JSON 转 Zod Schema

从 JSON 数据即时生成 Zod 验证 schema,支持嵌套对象、数组、nullable 字段和可选属性。完全在浏览器中运行。

100% 浏览器端运行 数据不离开你的设备 免费 · 无需注册
JSON 输入
Zod Schema 输出

使用方法

  1. 将 JSON 数据粘贴到左侧面板(或点击示例)。
  2. 设置根 Schema 名称(用于导出常量和类型)。
  3. 可选:启用严格模式以禁止多余字段。
  4. 点击生成 Zod Schema。
  5. 点击复制将结果粘贴到你的项目中。

输出格式

生成器输出完整的 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 数据不会离开你的设备。