Oh MyUtils

JSON to Python - データクラス&Pydanticモデル生成 オンライン

JSONをPythonのdataclass、Pydantic BaseModel、TypedDictに変換。型推論、snake_case変換、日付検出 — 100%ブラウザで処理.

ルート名
フォーマット
Syntax
フラグ
JSON入力
Python出力
 

よくある質問

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

関連ツール