100% ローカル — データがブラウザの外に出ることはありません

JSONをZodに変換|受け取ったところで検証できる形にする

JSONのサンプルをZodのスキーマに変換します。オブジェクトごとに一つ、使う前に宣言され、z.infer を使えば同じ定義から TypeScript の型も得られます。

高速 プライベート Cookieゼロ

JSON 入力

Zod 出力

このツールの動作

JSON の標本が Zod のスキーマになります。オブジェクト一つにつき const が一つです。

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import { z } from "zod";

export const AddressSchema = z.object({
  city: z.string(),
});

export const RootSchema = z.object({
  id: z.int(),
  name: z.string(),
  address: AddressSchema,
});

子が先に来ます。これらは実行時の定数であり、別のスキーマから名指しされる前に存在している必要があるからです。

数値は書かれたとおりに読む

整数なら z.int()、小数点や指数を伴うものは z.number() です。

{ "price": 10.0, "quantity": 3 }
price: z.number(),
quantity: z.int(),

少し前まで price は z.int() になっていました。10.0 は整数として解析され、字面はどこにも残らなかったからです。そのスキーマは 10.5 を拒みます。おそらく次の一件です。JSON の数値型は一つきりなので、書かれた形が、送り手が何のつもりだったかを示す唯一の証拠です。変換は今それを読みます。この文章を書く過程で見つけ、直しました。

Zod 4 の書き方

z.int() は Zod 4 の書き方です。Zod 3 では z.number().int() と書いてください。この出力で両版が異なるのはそこだけです。

標本があなたの代わりに決められないこと

  • .optional() はどこにも付きません。 一度見えた鍵は現れうるだけで、いつも現れるかは文書にありません。
  • null は z.null() になります。 ほかを一切受け付けないスキーマです。「文字列、ときどき無い」なら、.nullable() はあなたが足すものです。
  • 知らない鍵は取り除かれ、拒まれません。 Zod の既定だからです。.strict() はあなたの API についての判断です。
  • 型の混ざった配列は合併になります。 [1, "a"] は z.array(z.union([z.int(), z.string()])) になり、標本を正確に述べます。実際のデータより広いかもしれません。

いずれも、生成されたスキーマが出発点にすぎない箇所です。この頁はそれを、あなたがレビューで気づく前に述べます。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ `10.0` は `z.number()` で、`3` は `z.int()` なのですか。
そう書かれているからです。JSON の数値型は一つきりなので、元の型の手がかりは字面しかありません。小数点や指数があれば、書き手の側は浮動小数だったということです。`10.0` は以前 `z.int()` になり、スキーマは 10.5 を——つまり次の一件を——拒んでいました。本物の欠陥で、直しました。
`z.int()` は Zod 3 にもありますか。
ありません。Zod 4 で入りました。3 系では同じものを `z.number().int()` と書きます。置換すれば済みます。出力のそれ以外——`z.object`、`z.array`、`z.union`、`z.null`——は両版で同じです。
スキーマは知らない鍵を拒みますか。
拒みません。`z.object()` は知らないものを失敗させずに取り除きます。これは Zod の既定で、ここでもそのままにしています。余分な鍵を誤りとしたいなら `.strict()` をご自分で足してください。あなたの API についての判断であり、標本が教えられることではありません。

関連ツール