JSONからPythonデータクラスへの変換

JSONサンプルを貼り付けると、各フィールドに対する型ヒントが付いた@dataclass(またはPydanticのBaseModel)が生成されます。適切な場所にはstrintfloatboolOptional[...]およびList[...]が含まれます。ネストされたオブジェクトはそれぞれ独立したデータクラスとして扱われます。出力結果はPEP 8形式で、Pythonファイルに貼り込む準備ができています。

JSONをデータクラスに変換する方法

  1. 1

    JSONを貼り付けます

    1つのサンプルで十分です。複数のサンプルを使用すると、どのフィールドがnullになり得るかの検出精度が向上します。

  2. 2

    スタイルを選択してください

    標準ライブラリの`@dataclass`、Pydanticの`BaseModel`、または静的な型チェック専用の`TypedDict`から選びます。

  3. 3

    Pythonバージョンを選択してください

    `list[str]`の構文には3.9以上、`|`のユニオン型には3.10以上、`Optional[...]`および`List[...]`には3.8が必要です。

  4. 4

    コードをコピーします

    1つのルートクラスとネストされたクラスを指定します。`.py`ファイルに貼り付け、インポートしてください。

サンプル出力:標準 @dataclass

入力:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

出力(Python 3.10以上):

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class User:
    first_name: str
    age: int
    tags: list[str] = field(default_factory=list)
    email: Optional[str] = None

Pydanticで同じ入力

from typing import Optional
from pydantic import BaseModel


class User(BaseModel):
    first_name: str
    age: int
    email: Optional[str] = None
    tags: list[str] = []

タイプマッピング

JSON値 Pythonの型
文字列 str
整数 int
数値(小数) float
ブール値 bool
null(単独で表示) None
null + その他のタイプ Optional[T]
ISO日付文字列 date(Python 3.7+)
ISO日時 datetime
1種類の配列 list[T]
混在した配列 list[Union[T1, T2]]
オブジェクト ネストされたクラス

データクラス vs Pydantic vs TypedDict

種類 使用する場面
@dataclass 標準ライブラリによる解決策。実行時の検証なし
Pydantic 実行時の検証および強制変換(FastAPI、設定)
TypedDict 静的型チェックのみ、インスタンスクラスは生成しない
attrs attrsで標準化されたレガシープロジェクト

よくある間違い

  • 可変なデフォルト値にdefault_factoryを忘れる。 list[str] = []というデフォルト値はインスタンス間で共有されるデータクラスの落とし穴です。field(default_factory=list)を使用してください。
  • デフォルト値のないOptional。 email: Optional[str]だけでは= Noneが付いていない限り、依然として引数が必須です。JSONの意味に合わせてください。
  • Pydantic v1とv2の違い。 構文と動作が異なります(クラスConfigmodel_configvalidatorfield_validator)。ジェネレータはデフォルトでv2を使用します。
  • ユニオンの順序はデシリアライズにおいて重要です。 Pydanticは宣言順に型を試します。曖昧さが生じ得る場合は、最も具体的な型を先に指定してください(例:intstrの前に指定)。

よくある質問

検証機能を備えないシンプルな値保持型用のデータクラスです。実行時での検証、強制変換、またはFastAPIとの統合が必要な場合はPydanticを使用します。静的な型チェックのみが必要でクラスインスタンスを必要としない場合はTypedDictを使用します(mypy、pyrightなど)。

Python 3.10以降では|ユニオンやlist[str]構文がネイティブに使えるため不要です。PEP 563の文字列アノテーションを使って新しい構文を利用する3.7~3.9のプロジェクトでは役立ちます。必要な場合はジェネレータが警告を表示します。

各ネストされたオブジェクトはそれぞれ独立したクラスとなります。ルートクラスは名前を参照することでこれらを呼び出し、型の再利用が可能です。循環参照は検出され、フラグが設定されます。

はい、Pydantic形式を選択した場合に使えます。FastAPIはPydanticモデルを直接リクエスト/レスポンスの型として使用します。内部でのデータのやり取りには、@dataclassの方が軽量です。

関連ツール

このツールは他の言語でも利用できます