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ドキュメント生成を行うリクエスト/レスポンスモデルが必要な場合に使用します。

試してみる — JSON to Python Converter

フルツールを開く