JSONからPython dataclassジェネレーター

JSONからPythonのdataclassを自動生成

サンプルを試す
ルートクラス名:

JSON入力

Python出力

ローカルで実行 · シークレットの貼り付けも安全
Pythonのdataclassがここに表示されます…

JSONからPython dataclassへの変換とは?

JSONからPython dataclassへの変換は、生のJSONオブジェクトを受け取り、正確な型アノテーション付きのPython dataclass定義セットを生成します。PEP 557(Python 3.7)で導入されたPythonのdataclassesモジュールは、アノテーション付きクラスフィールドから__init__、__repr__、__eq__メソッドを自動生成します。JSON API・設定ファイル・メッセージキューを扱う際、dataclassはデータに型付き構造を与え、エディタやmypyのような型チェッカーが開発時に検証できるようにします。

Pythonのjson.loads()はプレーンなdictとlistを返します。これで動作はしますが、型情報がありません。スペルミスのあるキーはエラーを発生させずにNoneを返し、エディタはフィールド名を補完できません。dataclassはJSONの各キーを名前付きの型付きフィールドにマッピングすることでこの問題を解決します。ネストされたJSONオブジェクトは個別のdataclass定義になり、配列はList[T]アノテーションになり、null値はデフォルト値Noneを持つOptional[T]になります。

これらの定義を手書きするのは機械的な作業です。JSONを読み、各フィールドの型を値から判断し、キーをcamelCaseやsnake_caseからPythonの慣習に変換し、nullableフィールドや混在型配列などのエッジケースを処理する必要があります。変換ツールはこれをミリ秒以内に行います。JSONを貼り付けると正しいdataclassのコードが得られ、すぐに作業を進められます。

JSONからPython変換ツールを使う理由

JSON構造をPythonクラス定義に手動で変換するには、サンプルデータから型を推測し、必須フィールドをオプションフィールドより前に並べ、APIが変更されたらすべてを更新する作業が伴います。変換ツールはその手間を取り除きます。

即座にdataclassを生成
JSONを貼り付けると、1秒以内に型付きPython dataclass定義が得られます。ネストされたオブジェクト・リスト・オプションフィールドは自動的に処理されます。
🔒
プライバシー優先の処理
変換はすべてブラウザ上でJavaScriptを使って実行されます。JSONがマシンの外に出ることはありません。APIキー・トークン・ユーザーレコードはプライベートに保たれます。
📝
正確な型アノテーション
生成されるすべてのフィールドには、JSON値から推論されたPythonの型アノテーションが含まれます:str、int、float、bool、List[T]、またはnullに対してはOptional[T]です。
📦
インストール・サインアップ不要
ページを開いてJSONを貼り付けるだけです。Python環境は不要で、pipパッケージのインストールもアカウントの作成も必要ありません。

JSONからPythonへの変換ユースケース

REST APIクライアント開発
APIレスポンスのサンプルからdataclassを生成します。サードパーティのRESTエンドポイントが返すJSONを貼り付けると、requestsやhttpxですぐに使える型安全なPythonクラスが得られます。
FastAPIのリクエスト/レスポンスモデル
JSONペイロードの形状からdataclass定義を生成します。それをPydanticモデルに変換することで、FastAPIのルートハンドラーで自動バリデーションを利用できます。
データパイプラインのスキーマ
ETLパイプライン用の型付きレコード構造を定義します。Kafka・RabbitMQ・SQSからのサンプルJSONメッセージを貼り付けて、期待する形状を文書化するdataclassを生成します。
設定ファイルの解析
JSON設定ファイルを型付きPythonクラスに変換します。json.load()で設定を読み込み、dataclassインスタンスを構築してエディタの補完と型チェックを活用します。
テストフィクスチャの生成
サンプルJSONデータから型付きフィクスチャを作成します。QAエンジニアはAPIレスポンスのスナップショットを貼り付けて、pytestのテストスイートで使用するdataclass定義を生成できます。
Python型アノテーションの学習
学習者は任意のJSON構造を貼り付けて、Pythonがそれをどのように型ヒントで表現するかを確認できます。生成されたコードはList・Optional・ネストされたクラス・デフォルト値が実際のコンテキストで示されます。

JSONからPythonへの型マッピング

JSONの各値は特定のPython型アノテーションに対応します。下表はtypingモジュールの構文(Python 3.7以上)とPython 3.10以降で利用可能な組み込み構文の両方を示しています。

JSON型値の例Python(typing)Python 3.10以降
string"hello"strstr
number (integer)42intint
number (float)3.14floatfloat
booleantrueboolbool
nullnullOptional[str]str | None
object{"k": "v"}@dataclass classnested model
array of strings["a", "b"]List[str]list[str]
array of objects[{"id": 1}]List[Item]list[Item]
mixed array[1, "a"]List[Any]list[Any]

@dataclassデコレーターリファレンス

@dataclassデコレーターは、生成されたクラスの動作を変えるいくつかのパラメーターを受け取ります。このリファレンスはJSON由来のデータを扱う際に特に関連するオプションを説明します。

デコレーター / フィールド動作使用場面
@dataclassGenerates __init__, __repr__, __eq__ from field annotationsStandard dataclasses
@dataclass(frozen=True)Makes instances immutable (hashable, no attribute reassignment)Config objects, dict keys
@dataclass(slots=True)Uses __slots__ for lower memory and faster attribute accessPython 3.10+, large datasets
@dataclass(kw_only=True)All fields require keyword arguments in __init__Python 3.10+, many fields
field(default_factory=list)Sets a mutable default without sharing state between instancesList/dict/set defaults

dataclass vs Pydantic vs TypedDict

PythonにはJSONから型付き構造を定義する3つの一般的な方法があります。それぞれ異なるユースケースに対応しています。dataclassは依存関係ゼロの標準ライブラリの選択肢です。Pydanticは実行時バリデーションを追加します。TypedDictは新しいクラスを作らずにプレーンなdictにアノテーションを付けます。

@dataclass
標準ライブラリ(Python 3.7以上)。__init__、__repr__、__eq__を自動生成します。実行時バリデーションはありません。mypyと、シリアライズのためのdataclasses-jsonと連携します。入力を制御できる内部データ構造に最適です。
BaseModel (Pydantic)
サードパーティライブラリ。実行時に型と制約を検証します。model_validate_json()でJSONを直接解析できます。FastAPI・設定管理・信頼できない入力を受け取るコードの標準的な選択です。
TypedDict
標準ライブラリ(Python 3.8以上)。通常のdictに型ヒントを追加します。__init__やメソッドは生成されません。値はプレーンなdictアクセスのままです。型チェックは必要だがdictインターフェースを維持したい場合、例えばレガシーなコードベースで有用です。

コード例

以下の例は、生成されたdataclassをPythonで使う方法、JavaScriptからプログラムで生成する方法、PydanticやCLIツールなどの代替手段を示しています。

Python (dataclasses)
from dataclasses import dataclass
from typing import List, Optional
import json

@dataclass
class Address:
    street: str
    city: str
    zip: str

@dataclass
class User:
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
data = json.loads(raw)

# Reconstruct nested objects manually
addr = Address(**data["address"])
user = User(**{**data, "address": addr})
print(user.name)     # -> Alice
print(user.address)  # -> Address(street='123 Main St', city='Springfield', zip='12345')
JavaScript (generate Python from JSON)
// Minimal JSON-to-Python-dataclass generator in JS
function jsonToPython(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Optional[str]";
    if (typeof val === "string") return "str";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "float";
    if (typeof val === "boolean") return "bool";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      return first ? `List[${infer(first, fieldName + "Item")}]` : "List[Any]";
    }
    if (typeof val === "object") {
      const clsName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, clsName);
      return clsName;
    }
    return "Any";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => `    ${k}: ${infer(v, k)}`);
    classes.push(`@dataclass\nclass ${cls}:\n${fields.join("\n")}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

const data = { id: 1, name: "Alice", scores: [98, 85] };
console.log(jsonToPython(data, "User"));
// @dataclass
// class User:
//     id: int
//     name: str
//     scores: List[int]
Python (Pydantic BaseModel alternative)
from pydantic import BaseModel
from typing import List, Optional

class Address(BaseModel):
    street: str
    city: str
    zip: str

class User(BaseModel):
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

# Pydantic parses and validates JSON in one step
raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
user = User.model_validate_json(raw)
print(user.name)              # -> Alice
print(user.model_dump_json()) # -> re-serializes to JSON
CLI (datamodel-code-generator)
# Install the generator
pip install datamodel-code-generator

# Generate dataclasses from a JSON file
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass

# Generate Pydantic models instead
datamodel-codegen --input data.json --output models.py

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  datamodel-codegen --output-model-type dataclasses.dataclass
# Output:
# @dataclass
# class Model:
#     id: int
#     name: str
#     tags: List[str]

よくある質問

Pythonのdataclassと通常のクラスの違いは何ですか?
dataclassは@dataclassデコレーターを使って、フィールドアノテーションから__init__・__repr__・__eq__メソッドを自動生成します。通常のクラスではこれらのメソッドを自分で書く必要があります。クラスが主にデータを保持する用途の場合(JSON由来の構造では典型的です)、dataclassはボイラープレートを大幅に削減します。
dataclassをJSONシリアライズに直接使えますか?
標準ライブラリのjsonモジュールはデフォルトではdataclassインスタンスをシリアライズできません。dataclasses.asdict()でdataclassをdictに変換してからjson.dumps()に渡してください。より細かい制御が必要な場合は、dataclasses-jsonライブラリが.to_json()と.from_json()メソッドを追加し、Pydanticモデルはシリアライズをネイティブにサポートしています。
コンバーターはネストされたJSONオブジェクトをどのように処理しますか?
ネストされたオブジェクトはそれぞれ個別の@dataclass定義になります。"address"という名前のJSONフィールドが"street"と"city"を含むオブジェクトの場合、コンバーターはAddressというdataclassを作成し、親フィールドをaddress: Addressとアノテーションします。深くネストされた構造は、依存関係の順番に並べられた複数のdataclass定義を生成します。
JSONフィールドがnullの場合はどうなりますか?
nullフィールドはOptional[str](またはコンテキストから推論できる場合は適切な型)にアノテーションされ、デフォルト値Noneが設定されます。デフォルト値を持つフィールドはdataclassでは必須フィールドの後に来る必要があるため、コンバーターはオプションフィールドをクラス定義の最後に配置します。
JSONにおいてdataclassとPydanticモデルの違いは何ですか?
dataclassは標準ライブラリの一部であり、実行時にデータを検証しません。Pydanticモデルは型を検証し、制約を強制し、生のJSON文字列を直接解析できます。外部ソースからJSONを受け取り、不正なデータを拒否する必要がある場合はPydanticが適しています。入力を信頼できる内部データの受け渡しには、dataclassが軽量で外部依存関係もありません。
PythonのdataclassでcamelCaseのJSONキーを扱うには?
Pythonの慣習では変数名にsnake_caseを使います。コンバーターは"firstName"のようなcamelCaseキーをfirst_nameのようなsnake_caseフィールドに変換します。JSONから逆シリアライズする必要がある場合は、2つの命名規則間のマッピングを設定するdataclasses-jsonライブラリを使うか、カスタムの__post_init__メソッドを書いてください。
このコンバーターはList[str]の代わりにlist[str]のようなPython 3.10以降の構文をサポートしますか?
コンバーターはPython 3.7から3.12との最大互換性のため、typingモジュールのインポート(List、Optional)を生成します。プロジェクトがPython 3.10以降を対象としている場合は、List[str]をlist[str]に、Optional[str]をstr | Noneに安全に置き換えられます。上記の型マッピング表は両方の形式を示しています。