JSON to Python - データクラス&Pydanticモデル生成 オンライン
JSONをPythonのdataclass、Pydantic BaseModel、TypedDictに変換。型推論、snake_case変換、日付検出 — 100%ブラウザで処理.
よくある質問
JSON to Pythonコンバーターとは何ですか?
JSON to Pythonコンバーターは、JSONデータからPythonクラス定義を自動生成するツールです。フィールド名と型アノテーションを手動でdataclassやPydanticモデルに記述する代わりに、サンプルJSONオブジェクトを貼り付けると、ツールがすべてのフィールドに対して正しいPython型を推論します。Python dataclass(標準ライブラリ)、Pydantic BaseModel(組み込みバリデーション付き)、TypedDict(軽量な型ヒント)の3つの出力形式をサポートしています。
JSONからPythonクラスを生成するには?
左側の入力フィールドにJSONデータを貼り付けてください。ツールが即座に右側の出力パネルにPythonコードを生成します。フォーマットセレクターを使用して、希望の出力形式(dataclass、Pydantic BaseModel、TypedDict)を選択できます。
dataclassとPydantic BaseModelのどちらを使うべきですか?
型アノテーション付きのシンプルで依存関係のないデータコンテナが必要な場合はPython dataclassを使用してください。ランタイムデータバリデーション、自動型変換、JSONシリアライズ/デシリアライズ、エイリアスサポートが必要な場合はPydantic BaseModelを使用してください。TypedDictはランタイムオーバーヘッドなしで辞書型データの型ヒントのみが必要な場合に使用します。
このツールはPydantic v2をサポートしていますか?
はい、このツールはPydantic v2コードのみを生成します。レガシーのclass Configパターンではなく、model_config = ConfigDict(...)を含む最新のPydantic v2構文を使用します。
このツールを使用する際、JSONデータは安全ですか?
はい、完全に安全です。このツールはクライアントサイドJavaScriptを使用してブラウザですべてを処理します。JSONデータはコンピュータから離れません — サーバーアップロード、API呼び出し、データ保存は一切ありません。
nullとoptionalフィールドはどのように処理されますか?
JSONフィールドにnull値がある場合、ツールはOptionalとしてマークし、デフォルト値をNoneに設定します。最新Python構文(3.10+)では'field_name: str | None = None'になります。レガシー構文では'field_name: Optional[str] = None'を使用します。
ネストされたJSONオブジェクトはどのように処理されますか?
各ネストされたJSONオブジェクトは個別の名前付きクラスに変換されます。例えば、JSONに'address'サブオブジェクトを持つ'user'オブジェクトがある場合、ツールは'User'クラスと'Address'クラスの両方を作成します。依存関係が参照するクラスの前に表示されるよう、出力内でクラスが正しく順序付けされます。
コード例
// JSON to Python dataclass/Pydantic generator
function jsonToPython(json, rootName = 'Root', format = 'dataclass') {
const classes = [];
function toPascalCase(str) {
return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '')
.replace(/^./, s => s.toUpperCase());
}
function toSnakeCase(str) {
return str.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase();
}
function inferType(value, name) {
if (value === null) return 'None';
if (typeof value === 'boolean') return 'bool';
if (typeof value === 'number') {
return Number.isInteger(value) ? 'int' : 'float';
}
if (typeof value === 'string') return 'str';
if (Array.isArray(value)) {
if (value.length === 0) return 'list[Any]';
return `list[${inferType(value[0], name)}]`;
}
if (typeof value === 'object') {
const className = toPascalCase(name);
const fields = Object.entries(value).map(([key, val]) => {
const pyType = inferType(val, key);
const fieldName = toSnakeCase(key);
if (format === 'pydantic' && fieldName !== key) {
return ` ${fieldName}: ${pyType} = Field(alias="${key}")`;
}
return ` ${fieldName}: ${pyType}`;
});
if (format === 'dataclass') {
classes.push(`@dataclass\nclass ${className}:\n${fields.join('\n')}`);
} else if (format === 'pydantic') {
classes.push(`class ${className}(BaseModel):\n${fields.join('\n')}`);
} else {
classes.push(`class ${className}(TypedDict):\n${fields.join('\n')}`);
}
return className;
}
return 'Any';
}
const parsed = JSON.parse(json);
inferType(parsed, rootName);
return classes.reverse().join('\n\n');
}
// Example
const json = '{"userName": "alice", "age": 30, "address": {"city": "NYC"}}';
console.log(jsonToPython(json, 'User', 'pydantic'));
// Output:
// class Address(BaseModel):
// city: str
//
// class User(BaseModel):
// user_name: str = Field(alias="userName")
// age: int
// address: Address