JSON → Zod スキーマ
JSONデータからZodバリデーションスキーマを即座に生成。ネストオブジェクト・配列・nullable・省略可能プロパティに対応。ブラウザ内で処理。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
出力形式
完全なTypeScriptスニペットを出力します:
import { z } from “zod”— Zodインポートconst FooSchema = z.object({…})— スキーマ定義export type Foo = z.infer<typeof FooSchema>— 推論されたTypeScript型
主な用途
- APIバリデーション:APIレスポンス例からスキーマを生成し、実際のレスポンスを実行時に検証。
- フォームバリデーション:フォームのデータ形状をZodスキーマに変換してreact-hook-formなどで活用。
- 設定ファイル:JSONファイルから読み込む設定オブジェクトの定義と検証。
- 型安全性:TypeScriptと組み合わせて1つのスキーマから実行時検証と静的型推論を同時に取得。
変換例
ルート名を User にして次の JSON を入力すると、
{
"id": 42,
"email": "alice@example.com",
"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 は 2 件の注文のうち 1 件にしかないので optional になります。出力には Zod 3 と Zod 4 の両方で動く書き方だけを使っています。
生成したスキーマの調整
サンプルには各フィールドの値が 1 つしかないため、業務ルールは推論できません。使う前に次の点を確認してください。
| 生成結果 | 問題 | 修正(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"]) |
| サンプルにあったフィールド | API が省略することがあっても必須になる | .optional() を付ける |
失敗したら処理を止めたい場所(起動時の設定読み込みなど)では .parse() を使います。ZodError を投げます。API レスポンスやユーザー入力には .safeParse() を使います。{ success: false, error } を返すので、エラーを自分で処理できます。
制限事項
- 型は 1 つのサンプルから決まります。 空の配列は
z.array(z.unknown())、空のオブジェクトはz.record(z.string(), z.unknown())になります。 nullはz.null()になります。.nullable()は付きません。オブジェクトの配列で、あるキーが 1 件目でnull、2 件目で文字列のときはz.union([z.null(), z.string()])になります。- 型が混ざった配列は union になります。
[{"a": 1}, 2]のような配列は、ルートでもオブジェクトの中でもz.array(z.union([z.number().int(), z.object({ a: z.number().int() })]))になります。同じ配列のオブジェクトは 1 つのz.objectにまとめるので、union のオブジェクトは 1 つです。 - 文字列の形式や範囲は付きません。 メール、URL、日付、UUID はすべて
z.string()です。
FAQ
Zodとは何ですか?
ZodはTypeScriptファーストのスキーマ宣言・バリデーションライブラリです。データの形状をスキーマで定義し、実行時にデータを検証できます。APIレスポンス検証・フォームバリデーション・設定ファイル解析に広く使われています。
型の推論はどう行われますか?
各JSON値を検査します:文字列→z.string()、真偽値→z.boolean()、整数→z.number().int()、浮動小数点→z.number()、null→z.null()、配列→z.array()、オブジェクト→z.object()。オブジェクトの配列では、一部のアイテムにしか存在しないキーはoptionalとしてマークされます。
ストリクトモードとは何ですか?
ストリクトモードを有効にすると、すべてのz.object()に.strict()が追加されます。スキーマに定義されていない余分なキーを含む入力オブジェクトはZodに拒否されます。無効時は余分なキーが無視されます(Zodのデフォルト動作)。
生成されたスキーマはそのまま使えますか?
生成スキーマは良い出発点です。文字列・数値への.min()/.max()制約追加、nullableフィールドの.nullable().optional()への変更、ネストスキーマの個別定数への分割など、プロジェクトに合わせて調整することをお勧めします。
JSONデータはサーバーに送信されますか?
いいえ。すべての処理はブラウザ内で完結します。JSONデータがデバイス外に出ることはありません。