JSONからPydantic BaseModelへの変換
自動バリデーション、シリアライゼーション、型強制を備えたPydantic BaseModelクラスにJSONを変換する方法を学びます。Pydantic v2の構文と機能を解説します。
Pydantic & TypedDict
詳細な説明
JSONからPydantic BaseModelへ
PydanticはPythonで最も人気のあるデータバリデーションライブラリです。ランタイムバリデーション、自動型強制、JSONシリアライゼーションを標準で提供します。
JSONの例
{
"id": 42,
"name": "Alice",
"email": "alice@example.com",
"age": 30,
"is_active": true,
"tags": ["admin", "developer"]
}
生成されるPython(Pydantic v2)
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
email: str
age: int
is_active: bool
tags: list[str]
Dataclassとの主な違い
| 機能 | dataclass | Pydantic BaseModel |
|---|---|---|
| バリデーション | なし(型ヒントのみ) | ランタイムバリデーション |
| 型強制 | なし | あり("42" -> 42) |
| JSONシリアライゼーション | 手動 | .model_dump_json() |
| JSONデシリアライゼーション | 手動 | .model_validate_json() |
| パフォーマンス | 構築が高速 | バリデーションのオーバーヘッド |
使用方法
import json
# dictから
user = User(**json.loads(raw_json))
# またはJSON文字列から直接(Pydantic v2)
user = User.model_validate_json(raw_json)
# JSONにシリアライズ
json_str = user.model_dump_json()
# dictに変換
data = user.model_dump()
バリデーションの実例
# ValidationErrorが発生 — ageはintでなければならない
User(id=1, name="Alice", email="a@b.com", age="not a number", is_active=True, tags=[])
# 動作する — Pydanticが"42"を42に強制変換
User(id=1, name="Alice", email="a@b.com", age="42", is_active=True, tags=[])
フィールド制約
Pydanticではバリデーション制約を追加できます:
from pydantic import BaseModel, Field
class User(BaseModel):
id: int = Field(gt=0)
name: str = Field(min_length=1, max_length=100)
email: str
age: int = Field(ge=0, le=150)
Dataclassの代わりにPydanticを選ぶべき場面
- ランタイムバリデーションが必要(API入力、フォームデータ、設定ファイル)。
- 自動JSON シリアライゼーション/デシリアライゼーションが欲しい。
- FastAPIを使用している(Pydanticモデルが必須)。
- 型強制が必要(文字列から数値への変換等)。
ユースケース
FastAPIアプリケーションを構築しており、受信JSONペイロードの自動バリデーション、型強制、OpenAPIドキュメント生成を行うリクエスト/レスポンスモデルが必要な場合に使用します。