型定義の生成

JSONからPythondataclassとPydanticモデルへ

値がnullの項目と、キー自体がない項目では、生成される既定値が異なります。

JSONからPython

JSON入力

解析と生成はこのブラウザ内で行います。入力は送信・保存しません。

生成ソース

生成オプション

Python 3.9以降。dataclassのmetadataは解析・検証しません。Pydantic 2.12.5のload_models(source)で選択した数値方針を適用できます。

配列から要素モデルRootを定義します。Pydanticのload_modelsはオブジェクトと配列に対応します。

2クラス・null許容2フィールド

JSONからPythonでAPIレスポンスをモデルの草案にします。成功時のデータだけでなく、任意項目が省かれたレコードも一緒に渡すと、欠落の可能性を型定義に反映できます。

dataclass自動生成は、属性名や型を手書きする作業を減らします。ただし、サンプルから分かるのは観測できた構造だけです。入力検証や入れ子の読み込みが必要ならPydanticを選んでください。

JSONからPythonで見直せること

欠落とnullを分ける

JSONからPythonは、すべてのサンプルに存在するnull許容フィールドを必須のままにします。一部で欠落するキーにはNoneの既定値を付けます。Optional型だけでは「省略してよい」という意味になりません。

二つのオブジェクトで、nullの空洞マーカーと欠けた欄が異なる既定値につながる図。

元のキーを見失わない

classや記号を含むキーは安全な属性名に変更します。元の表記はdataclassのmetadata、またはPydanticのaliasに記録。名前が衝突した場合も接尾辞で区別し、対応関係を残します。

不規則なキーが、安全な属性欄へmetadataとaliasの二つの経路でつながる図。

取り込む前に確認する三点

01

欠落したレコードも含める

ルートはオブジェクト、またはオブジェクトだけを含む空でない配列にします。配列の最初の要素だけでなく全要素を調べるため、項目の違うサンプルをまとめると推定結果が変わります。

02

既定値と型方針を選ぶ

ルートクラス名を決め、欠落キーのみか全フィールドを省略可能にするかを選択します。日付は既定でstrです。小数や指数表記を含む数値グループの精度が必要なら、生成前にDecimalへ切り替えます。

03

更新完了を待って保存する

編集後350msで自動生成します。自動を切ると生成ボタンとCtrl/Cmd+Enterが使えます。編集直後は古い結果を保存できません。クリアとサンプル読み込みは、入力・設定・出力を一回戻せます。

生成される型と読み込み方法

二種類のモデルを同じファイルへ

標準ライブラリのdataclassと、固定バージョン2.12.5のPydanticを選べます。子クラスを親より先に並べ、dataclassでは必須フィールドを既定値付きの前に置きます。出力はPython 3.9以降で使えます。

整数と小数で精度を選ぶ

整数だけのグループは任意精度のintです。小数・指数が混ざると既定でfloatとなり、同じグループの大きな整数も丸められる場合があります。DecimalモードのローダーはAnyの内部も含め、浮動小数点数を経由せず小数を解析します。

日付らしい文字列を慎重に扱う

ISO推定では有効な年月日、またはタイムゾーン付きで小数秒が6桁以下の完全な日時を認識します。同じ位置のnull以外の文字列が同じ種類であることが条件です。不正な日付や時差のない日時はstrのままです。

Pythonで使える属性名にする

属性はASCIIのsnake_caseになります。予約語、先頭の下線、model_*、BaseModelのメソッド名を避けます。空キー、絵文字、制御文字もaliasで保持します。インポート名も別名にして、Decimalなどのクラス名との衝突を防ぎます。

利用前に知っておきたい制約

dataclassはデータの容器
型ヒントやjson_keyのmetadataは、検証・別名の読み込み・日付解析・子オブジェクトの構築をしません。ネストしたdictをそのまま渡すとdictのままです。asdictも元のJSONキーではなくPython属性名を使います。
Pydanticは補助関数で読み込む
pydantic==2.12.5をインストールしてload_models(source)を呼びます。選んだ数値方針でjson.loadsした後にmodel_validateを実行します。model_validate_jsonを直接呼ぶと、このDecimal精度保証はありません。Decimalは通常JSON文字列として出力されます。
省略と検証には別の条件がある
Pydanticは元のJSONキーでのみ入力を受け、extra="forbid"で未知の項目を拒否します。Optional[T]はnullを許容し、既定値が省略を許容します。欠落と明示的nullを区別したい場合はmodel_fields_setも確認してください。通常の型変換は行いますが業務上の厳格な検証は推定しません。
証拠が足りない型は広く残す
種類の異なる値やnullだけの項目はAny、空配列はList[Any]、空の子オブジェクトはDict[str, Any]になります。列挙、UUID、EmailStr、TypedDict、JSON Schema、OpenAPI、ORMは生成しません。ルートの単純値、空配列、混在配列も対象外です。
名前や数値によっては生成できない
aliasを無効にすると、改名が必要なキーはエラーになります。孤立したUnicodeサロゲートのキーも拒否します。floatのオーバーフローや非ゼロ値がゼロになるアンダーフローは拒否しますが、通常の二進丸めは残ります。正確な小数にはDecimalを選んでください。
厳密なJSONと処理量の上限
コメント、末尾カンマ、重複キー、自動修復、ファイル読込、URL取得、Python実行はありません。入力50万文字、5万ノード、深さ40、結合後100フィールド、200クラス、キー・数値トークン各1000文字、指数の絶対値1万、出力100万文字が上限です。

JSONからPythonについての質問

入れ子のオブジェクトには別のクラスが作られますか?

はい。空でない子オブジェクトは個別のクラスになり、同じファイルで親より先に定義されます。型定義ができても、dataclassが辞書を自動的に子インスタンスへ変換するわけではありません。

元のキーはどのような属性名になりますか?

キーは安全なsnake_case属性へ変換されます。aliasが有効なら元のキーも残ります。Pydanticはそれを入力に使い、dataclassはmetadataに保存します。後者では自分で対応するアダプターを書く必要があります。

配列の要素はどの型になりますか?

List[T]を生成します。同じ配列位置の全要素から型を推定し、オブジェクトのキーを結合します。空配列では要素型が分からないためList[Any]になります。ルート配列は空でなく、全要素がオブジェクトである必要があります。

nullだけの項目はどう扱われますか?

nullだけでは具体的な型を決められずAnyになります。常に存在するキーなら必須のままです。他のサンプルに値があれば、その型にNoneを許容する注釈を付けられます。欠落している場合に初めて既定値を追加します。

標準ライブラリだけでJSONをdataclassに読み込めますか?

独自の変換処理を書けば可能です。JSONからPythonのdataclass出力にはデコーダーがありません。json.loadsの結果から別名を対応させ、子クラスを明示的に組み立ててください。自動構築にはPydanticのload_modelsを使えます。

推定結果に改善点がありますか?

実際のレコードでモデルを確かめる

JSONからPythonに欠落・null・境界値を含むサンプルを渡し、保存したモデルをアプリケーションの読み込み処理で確かめてください。