Python から JSON への変換ツール
Python の dict、dataclass、Pydantic モデルを貼り付けると、きれいな JSON が返ってきます。
このツールでできること
API リクエスト、テスト用のフィクスチャ、ちょっとしたドキュメントのために、Python の dict や dataclass を手で JSON に書き直した経験があるなら、その面倒さはご存じのはず。クォートを差し替え、True/False を true/false に、None を null に直し、datetime や Decimal を手でシリアライズする必要があります。ここに Python を貼り付ければ、json.dumps や Pydantic の .model_dump_json() が出すのと同じ、有効な JSON がそのまま返ります。つなぎのコードを書く必要はありません。
単純な文字列置換ではありません。シリアライズ時に Python が実際に何をするかを理解して処理します。シングルクォートの文字列はダブルクォートへ、tuple は JSON 配列へ、set や frozenset も配列になります。datetime と date は RFC 8259 に従った ISO-8601 文字列として出力され、Decimal は数値に、Enum メンバーはその .value が出ます。ネストされたオブジェクトはそのまま展開されるので、別の dataclass のリストを持つ dataclass もきれいに変換できます。
Pydantic モデル(v1・v2 どちらも)に対応しています。Field(alias=...) で設定したフィールドのエイリアスは出力のキー名に反映され、None の Optional フィールドは null として残り、Literal や Union 型は実行時の値として出力されます。複数のクラスを含むモジュール全体を貼り付けても大丈夫です。それぞれがトップレベルのエントリとして出てきます。
使い方
3 ステップだけ。2 行の dict でも 300 行のモジュールでも、やり方は同じです。
Convert を押す
緑の Convert ボタンをクリックします。ツールが Python を読み取り、オブジェクトグラフを組み立て、json.dumps と同じようにシリアライズします。読みやすさのためにインデント付きです。処理中は短いローディング表示が出ます。
JSON をコピーする
右側のパネルに、JSON 仕様に準拠した整形済み JSON が表示されます。リクエストボディ、pytest のフィクスチャ、FastAPI の OpenAPI 例、設定ファイルなど、使いたいところにそのまま貼り付けてください。
こんなときに便利です
API リクエストのフィクスチャ
Pydantic のリクエストモデルを持っていて、Postman や curl、Swagger のサンプル用に JSON ボディが必要なとき。モデルを貼ってコピーすれば完了です。
pytest やユニットテストのデータ
テストファイルの dataclass インスタンスを、統合テストやスナップショット比較用のシード JSON に変換できます。カスタムエンコーダは不要です。
設定ファイルのひな形
フィールドが数十個ある設定用の dataclass が、すぐ編集できる JSON テンプレートになります。波括弧を何度も手打ちする必要はもうありません。
ドキュメントとコードの同期
既にあるモデルから README や API リファレンス用の JSON サンプルを直接生成できるので、ドキュメントがコードから乖離することがなくなります。
よくある質問
Pydantic の v1 と v2 に対応していますか?
はい。両方に対応しています。Field(alias=...)、model_config、Field(default_factory=...)、ネストされたモデルもサポートしています。エイリアスは Pydantic 本体と同じ挙動で出力のキー名を置き換えます。
datetime・Decimal・UUID はどう扱われますか?
datetime・date・time は ISO-8601 文字列として出力されます。Decimal は JSON の数値(クォートなし)に、UUID は標準的な 16 進文字列になります。bytes は base64 エンコードされます。カスタムエンコーダを書いたときの Python の json モジュールの慣例と一致します。
Enum・Literal・Optional はどうなりますか?
Enum メンバーは .value を出力します。Literal["a", "b"] は実行時の文字列をそのまま出します。None の Optional[X] フィールドは、消えるのではなく JSON の null として残ります。型ヒントどおりの出力形状が保たれます。
複数クラスを含むモジュール全体を貼り付けても大丈夫ですか?
大丈夫です。モジュール内にインスタンスがあるトップレベルのクラスは、それぞれ JSON の個別エントリとして出力されます。ネストされた dataclass や Pydantic モデルはそのまま展開され、親クラスから継承したフィールドも含まれます。
コードはどこかに保存されますか?
コードは変換のためだけにバックエンドへ送られます。ログにも残さず、保存もしません。とはいえオンラインツール全般に言えることですが、本当に機密性の高いものを貼り付ける前には中身を一度確認することをおすすめします。
lambda やジェネレータ、ファイルハンドルのような特殊なものがあるときは?
シリアライズできない値(関数、ジェネレータ、開いたソケットなど)は、変換全体を壊すのではなく null として出力されます。ソースに構文エラーがある場合は、まず明らかなものを直してください。パーサーはスタイルの揺らぎには寛容ですが、壊れたコードを実行することはできません。
一緒に使えるツール
Python から JSON への変換は全体の一部です。組み合わせて使いやすいツールをまとめておきます。