JSON から Python の dataclass・TypedDict へ

JSON を Python の dataclass や TypedDict クラスに変換します。型ヒント、Optional フィールド、依存順に並んだ入れ子のクラスに対応。無料でブラウザー内で動作します。

依存関係が先に来るようにクラスを並べます。省略可能なフィールドの既定値は None で、TypedDict 出力は NotRequired(Python 3.11+)を使います。

すべてブラウザ内で実行されます。データがアップロードされることはありません。

関連ツール

すべて表示

JSON から Pythonとは?

JSON のサンプルから、@dataclass クラスまたは TypedDict 定義のどちらかで型付きの Python クラスを生成します。入れ子のオブジェクトは別々のクラスになり、それらを使うクラスより前に出力されるので、モジュールを問題なくインポートできます。

JSON から Pythonの使い方

  1. JSON 入力 に JSON のサンプルを貼り付けます(サンプルを読み込む や ファイルを開く も使えます)。
  2. ルート型の名前 を設定します(既定は Root)。
  3. 出力スタイル を @dataclass か TypedDict から選びます。
  4. 生成された Python のコードをコピーするか、ダウンロード してファイルとして保存します。

例

入力
{"id":1,"name":"A","tags":["x"]}
出力
from dataclasses import dataclass
from typing import List


@dataclass
class Root:
    id: int
    name: str
    tags: List[str]

JSON から Pythonを使うべき場面

スクリプト、FastAPI のコード、テストで JSON ペイロードに型ヒントを付けたいときに使います。dataclass は入れ子の dict を自動では変換しません。その場合は dacite や pydantic などのライブラリを使うか、素の dict のままにできる TypedDict スタイルを選んでください。

JSON から Pythonの仕組み

サンプルを再帰的にたどり、各位置で見つかった型を集めます。オブジェクトの配列は 1 つの型にまとめられ、一部の要素にないキーはオプショナル、どこかで null になるキーは null 許容になります。整数と小数が混在する場合は浮動小数点型になり、それ以外で型が混在する場合は動的な型にフォールバックします。入れ子のオブジェクトは名前付きの型になり(キーのパスカルケースで、配列のキーは単数形にします:orders → Order)、名前が衝突した場合は数字の接尾辞が付きます。Python の出力では int、float、str、bool、List[T] を使い、null は Optional[T]、動的な値は Any にします。dataclass では必須フィールドが先に並び、オプショナルなフィールドには = None が付きます。識別子として使えないキー(class のような予約語を含む)は、# JSON key コメント付きでスネークケースに変更されます。TypedDict の出力では、ないキーに NotRequired を付け、識別子として使えないキーがある場合は関数形式の TypedDict("Name", {...}) 構文に切り替わります。

一般的な使用例

  • mypy や Pyright 向けに JSON API のレスポンスへ型注釈を付ける
  • 設定ファイル用の dataclass を作る
  • Webhook のペイロードを TypedDict で記述する
  • pydantic に移行する前の出発点となるモデルを生成する

よくある質問

必要な Python のバージョンは?

dataclass の出力は Python 3.7 以上で動作します。TypedDict の出力は NotRequired を使い、これは Python 3.11 以降の typing モジュールで利用できます(それ以前は typing_extensions が必要です)。

一部のフィールド名が変更されるのはなぜですか?

first-name や class のようなキーは属性名として使えないため、first_name / class_ となり、元の JSON キーを示すコメントが付きます。

JSON をそのまま dataclass に読み込めますか?

フラットなデータなら Root(**data) で動作します。入れ子のオブジェクトは、自分で変換するかヘルパーライブラリを使わない限り dict のままです。

おすすめの次のステップ

他のカテゴリを見る