JSON から TypeScript・Zod・Pydantic の型を生成

1 つの JSON サンプルから TypeScript の型、Zod スキーマ、Pydantic モデルをこのページ内で生成します。出力は公開前に tsc --strict・Zod 3/4・Pydantic 2 で確認しています。

ブラウザ内でローカルに実行
JSON サンプル

API レスポンス、フィクスチャ、設定オブジェクトを貼り付けてください。サンプルはこのブラウザ内に留まります。

生成されたコード
Generate from a JSON sample to create TypeScript types.

推論は渡されたサンプルに基づきます。生成した型を本番で使う前に、ID、null 許容の値、日付文字列、業務上の制約を確認してください。

3 つの出力の作り方

JSON サンプルを貼り付け、ルート型の名前を決めて「型を生成」を押すと、同じ構造が TypeScript・Zod・Pydantic のタブにそれぞれ出力されます。サンプルを読むのはこのページのブラウザー自身で、送信も外部へのリクエストもありません。

推論した名前は公開前に実際のコンパイラーで確認しています。TypeScript の出力は tsc --strict を通過し、Zod スキーマは Zod 3 と Zod 4 で自身のサンプルを検証でき、Pydantic モデルは Pydantic 2 で import してサンプルを検証できます。

  1. JSON サンプル(API レスポンス、フィクスチャ、設定オブジェクト)を貼り付けます。
  2. ルート型の名前を決めます。空白・ハイフン・アンダースコアは連結して先頭を大文字にした名前になります。
  3. 「型を生成」を押し(「サンプルを読み込む」で入力済みの例も使えます)、TypeScript・Zod・Pydantic のタブを切り替えます。
  4. 表示中のタブで「表示中のコードをコピー」を押し、任意フィールドと null 許容フィールドを使用前に確認します。

推論できること、できないこと

3 つの出力

JSON オブジェクトは interface(サンプルが配列や単一値なら型エイリアス)になり、配列は Array<…>、空オブジェクトは Record<string, unknown> になります。Zod には同じ構造がスキーマと z.infer の型として、Pydantic にはオブジェクトごとに BaseModel クラスが出力され、typing の List・Optional・Union・Dict を使います。

「型定義をエクスポート」のチェックで TypeScript と Zod の行に export を付けるかどうかを決められます。Pydantic の出力はどちらでも通常の Python です。

配列と任意フィールド

配列の全要素を統合します。一部のオブジェクトにしかないキーは任意になり(TypeScript では role?: string、Zod では .optional()、Pydantic では Optional[…] = None)、値の型が分かれるキーはユニオンになります。オブジェクトとスカラーや null が混在する場合もユニオンになり、null が他の型を打ち消すことはありません(並べて残します)。

空配列は unknown / z.unknown() / List[Any] になります。要素のないサンプルには型の情報がないためです。

名前の書き換え

Python で書けないキーは JSON の表記を alias として残します。{"a-b": 1} は alias="a-b" 付きの a_b になり、class・import・None は class_・import_・None_ になってファイルが import できるようになります。model_config や model_dump など model_ で始まるキーにも接尾辞を付けます(Pydantic がこの名前空間を予約しているため)。

そのままだと 1 つのフィールドに重なるキーは分けたままにします。{"a-b": 1, "a_b": 2} はそれぞれ alias を持つ a_b と a_b_2 になり、名前が衝突する入れ子のオブジェクトには別々のクラスが付きます。

制限とプライバシー

処理はすべてタブ内で完結します。変換時にリクエストは送られず、サンプルは再読み込みで消えます。2 MB のサンプルは Chrome で約 0.35 秒で型にできます。

型は 1 つのサンプルから作るため、その文書にある内容を表します。任意フィールドは配列の一部に欠けているキーであり、API が省略しうるキーではありません。文字列は string のままで、メール・日付・UUID の形式は推測しません。サンプルはブラウザーの JSON パーサーで読むため、2^53 を超える整数は精度が落ち、Pydantic の出力では float になります。

最近使ったツール: