変換 JSON → Python dataclass
JSON から Python の dataclass を作る
JSON サンプルから Python の @dataclass / Pydantic / TypedDict を生成する方法を解説します。
解説
Python で JSON データを型付きで持つ選択肢は主に 4 つです。dict のまま使う、標準ライブラリの @dataclass、TypedDict、外部ライブラリの Pydantic です。 @dataclass は型ヒント付きの軽量データクラスを作りますが、バリデーションは行いません。Pydantic は宣言的な書き方でランタイム検証まで行うので、API のリクエスト/レスポンス検証向きです。TypedDict は型ヒントだけ欲しいケース向け。API は Pydantic、内部データは @dataclass が定番です。
サンプル入力(JSON)
{
"id": 42,
"name": "alice",
"is_admin": false,
"tags": ["editor"]
} サンプル出力(Python dataclass)
from dataclasses import dataclass
from typing import List
@dataclass
class User:
id: int
name: str
is_admin: bool
tags: List[str] 使うときのコツ
- · Pydantic v2 は v1 より高速。新規プロジェクトでは v2 を推奨
- · Optional[X] は X | None と書ける(Python 3.10+)
- · Pydantic の Field でバリデーションルールを宣言できる(min_length, ge, le など)
よくある質問
▶ dataclass と Pydantic はどちらを使うべき?
ランタイム検証が必要なら Pydantic、内部データ構造なら dataclass。Pydantic は依存・起動コストがあるので、軽量に済ませたい場合は dataclass が向きます。
▶ JSON のキーが Python のキーワードと衝突する場合は?
Pydantic v2 では Field の alias 引数で別名を割り当てられます。dataclass では難しいので、JSON 側のキーを変換してから渡すのが現実的です。
▶ ネストしたオブジェクトはどう書く?
別の dataclass を定義し、フィールド型として参照します。Pydantic も同様に別モデルを参照できます。
▶ snake_case と camelCase の混在はどう扱う?
Pydantic では `model_config = ConfigDict(populate_by_name=True)` と `Field(alias='camelCase')` で対応できます。標準 dataclass では json.loads 後に手で変換します。
▶ datetime はどう扱う?
Pydantic は ISO 8601 文字列を datetime に自動変換できます。dataclass では json.loads 後に自前で datetime.fromisoformat() を呼びます。
▶ ツールで自動化したい
datamodel-code-generator が JSON Schema や OpenAPI から Pydantic / dataclass を生成できる代表的なツールです。
関連ツール
JSON フォーマッタ
JSON を整形・圧縮・キーソートします。