JSON to Python

Python-Dataclasses aus JSON generieren

Beispiel ausprobieren
Name der Root-Klasse:

JSON-Eingabe

Python-Ausgabe

Läuft lokal · Sicher zum Einfügen von Secrets
Python-Dataclasses erscheinen hier…

Was ist die JSON-zu-Python-Dataclass-Konvertierung?

Die JSON-zu-Python-Dataclass-Konvertierung nimmt ein rohes JSON-Objekt und erzeugt daraus eine Menge von Python-Dataclass-Definitionen mit korrekten Typ-Annotationen. Das dataclasses-Modul, eingeführt mit PEP 557 (Python 3.7), generiert automatisch __init__, __repr__ und __eq__-Methoden aus annotierten Klassenfeldern. Beim Arbeiten mit JSON-APIs, Konfigurationsdateien oder Message Queues verleihen Dataclasses den Daten eine typisierte Struktur, die Editoren und Type-Checker wie mypy zur Entwicklungszeit überprüfen können.

Pythons json.loads() gibt einfache Dicts und Listen zurück. Diese funktionieren, tragen aber keine Typinformationen: Ein falsch geschriebener Schlüssel liefert None, anstatt einen Fehler auszulösen, und der Editor kann Feldnamen nicht autovervollständigen. Dataclasses lösen dieses Problem, indem jeder JSON-Schlüssel einem benannten, typisierten Feld zugeordnet wird. Verschachtelte JSON-Objekte werden zu separaten Dataclass-Definitionen, Arrays werden zu List[T]-Annotationen, und null-Werte werden zu Optional[T] mit einem Standardwert von None.

Diese Definitionen von Hand zu schreiben ist mechanische Arbeit. Man liest das JSON, leitet den Typ jedes Feldes aus seinem Wert ab, konvertiert Schlüssel von camelCase oder snake_case in Python-Konventionen und behandelt Sonderfälle wie Nullable-Felder und Arrays mit gemischten Typen. Ein Konverter erledigt das alles in Millisekunden. JSON einfügen, korrekten Dataclass-Code erhalten und weitermachen.

Warum einen JSON-zu-Python-Konverter verwenden?

JSON-Strukturen von Hand in Python-Klassendefinitionen zu übersetzen bedeutet, Typen aus Beispieldaten zu raten, Felder so anzuordnen, dass Pflichtfelder vor optionalen kommen, und alles zu aktualisieren, wenn sich die API ändert. Ein Konverter beseitigt diese Reibung.

Dataclasses sofort generieren
JSON einfügen und typisierte Python-Dataclass-Definitionen in unter einer Sekunde erhalten. Verschachtelte Objekte, Listen und optionale Felder werden automatisch verarbeitet.
🔒
Datenschutz durch lokale Verarbeitung
Die Konvertierung läuft vollständig im Browser per JavaScript. Das JSON verlässt niemals den eigenen Rechner. API-Schlüssel, Tokens und Nutzerdaten bleiben privat.
📝
Korrekte Typ-Annotationen
Jedes generierte Feld enthält eine Python-Typ-Annotation, die aus dem JSON-Wert abgeleitet wird: str, int, float, bool, List[T] oder Optional[T] für null-Werte.
📦
Keine Installation oder Anmeldung erforderlich
Seite öffnen und JSON einfügen. Keine Python-Umgebung erforderlich, keine pip-Pakete zu installieren, kein Konto zu erstellen.

JSON-zu-Python-Anwendungsfälle

REST-API-Client-Entwicklung
Dataclasses aus API-Response-Beispielen generieren. Das von einem Drittanbieter-REST-Endpunkt zurückgegebene JSON einfügen und typsichere Python-Klassen für requests oder httpx erhalten.
FastAPI-Request/Response-Modelle
Aus einer JSON-Payload-Struktur starten und Dataclass-Definitionen generieren. Diese in Pydantic-Modelle umwandeln, um automatische Validierung in FastAPI-Route-Handlern zu erhalten.
Datenpipeline-Schemata
Typisierte Record-Strukturen für ETL-Pipelines definieren. Eine Beispiel-JSON-Nachricht aus Kafka, RabbitMQ oder SQS einfügen und Dataclasses generieren, die die erwartete Struktur dokumentieren.
Konfigurationsdateien parsen
JSON-Konfigurationsdateien in typisierte Python-Klassen umwandeln. Die Konfiguration mit json.load() laden, dann eine Dataclass-Instanz für Editor-Autovervollständigung und Type-Checking erstellen.
Test-Fixtures generieren
Typisierte Fixtures aus JSON-Beispieldaten erstellen. QA-Ingenieure können API-Response-Snapshots einfügen und Dataclass-Definitionen für pytest-Test-Suites erzeugen.
Python-Typ-Annotationen erlernen
Einsteiger können beliebige JSON-Strukturen einfügen und sehen, wie Python sie mit Type Hints darstellt. Der generierte Code zeigt List, Optional, verschachtelte Klassen und Standardwerte im Zusammenhang.

JSON-zu-Python-Typ-Mapping

Jeder JSON-Wert wird einer bestimmten Python-Typ-Annotation zugeordnet. Die Tabelle zeigt, wie der Konverter jeden JSON-Typ übersetzt — sowohl die typing-Modul-Syntax (Python 3.7+) als auch die eingebaute Syntax ab Python 3.10.

JSON-TypBeispielPython (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-Decorator-Referenz

Der @dataclass-Decorator akzeptiert mehrere Parameter, die das Verhalten der generierten Klasse beeinflussen. Diese Referenz behandelt die Optionen, die beim Arbeiten mit JSON-abgeleiteten Daten am relevantesten sind.

Decorator / FeldVerhaltenEinsatz wenn
@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 bietet drei gängige Wege, typisierte Strukturen aus JSON zu definieren. Jeder eignet sich für einen anderen Anwendungsfall. Dataclasses sind die Standardbibliothek-Option ohne externe Abhängigkeiten. Pydantic fügt Laufzeit-Validierung hinzu. TypedDict annotiert gewöhnliche Dicts, ohne eine neue Klasse zu erstellen.

@dataclass
Standardbibliothek (Python 3.7+). Generiert __init__, __repr__ und __eq__. Keine Laufzeit-Validierung. Funktioniert mit mypy und dataclasses-json für die Serialisierung. Beste Wahl für interne Datenstrukturen, bei denen die Eingabe kontrolliert wird.
BaseModel (Pydantic)
Drittanbieter-Bibliothek. Validiert Typen und Einschränkungen zur Laufzeit. Parst JSON direkt über model_validate_json(). Standardwahl für FastAPI, Konfigurationsverwaltung und jeden Code, der nicht vertrauenswürdige Eingaben empfängt.
TypedDict
Standardbibliothek (Python 3.8+). Fügt gewöhnlichen Dicts Type Hints hinzu. Kein __init__ oder Methoden werden generiert. Werte bleiben als normaler Dict-Zugriff erhalten. Verwenden, wenn Typ-Checking gewünscht ist, aber die Dict-Schnittstelle beibehalten werden soll — etwa in älteren Codebases.

Code-Beispiele

Diese Beispiele zeigen, wie generierte Dataclasses in Python verwendet werden, wie sie programmatisch aus JavaScript erzeugt werden und wie alternative Ansätze wie Pydantic und CLI-Tools eingesetzt werden.

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]

Häufig gestellte Fragen

Was ist der Unterschied zwischen einer Python-Dataclass und einer regulären Klasse?
Eine Dataclass verwendet den @dataclass-Decorator, um __init__, __repr__ und __eq__-Methoden automatisch aus Feld-Annotationen zu generieren. Eine reguläre Klasse erfordert, diese Methoden selbst zu schreiben. Dataclasses reduzieren Boilerplate, wenn die Klasse primär Daten hält — was bei JSON-abgeleiteten Strukturen typischerweise der Fall ist.
Kann ich Dataclasses direkt für die JSON-Serialisierung verwenden?
Das json-Modul der Standardbibliothek kann Dataclass-Instanzen standardmäßig nicht serialisieren. dataclasses.asdict() verwenden, um eine Dataclass in ein Dict umzuwandeln, und dieses dann an json.dumps() übergeben. Für mehr Kontrolle fügt die dataclasses-json-Bibliothek .to_json()- und .from_json()-Methoden hinzu, und Pydantic-Modelle behandeln die Serialisierung nativ.
Wie verarbeitet der Konverter verschachtelte JSON-Objekte?
Jedes verschachtelte Objekt wird zu einer separaten @dataclass-Definition. Wenn ein JSON-Feld namens "address" ein Objekt mit "street" und "city" enthält, erstellt der Konverter eine Address-Dataclass und annotiert das übergeordnete Feld als address: Address. Tief verschachtelte Strukturen erzeugen mehrere Dataclass-Definitionen in Abhängigkeitsreihenfolge.
Was passiert, wenn ein JSON-Feld null ist?
Null-Felder werden als Optional[str] annotiert (oder der passende Typ, wenn er aus dem Kontext abgeleitet werden kann) mit einem Standardwert von None. Felder mit Standardwerten müssen in einer Dataclass nach Pflichtfeldern kommen, daher platziert der Konverter optionale Felder am Ende der Klassendefinition.
Gibt es einen Unterschied zwischen Dataclasses und Pydantic-Modellen für JSON?
Dataclasses sind Teil der Standardbibliothek und validieren Daten nicht zur Laufzeit. Pydantic-Modelle validieren Typen, erzwingen Einschränkungen und können rohe JSON-Strings direkt parsen. Wenn JSON aus externen Quellen empfangen wird und fehlerhafte Daten abgelehnt werden müssen, ist Pydantic die bessere Wahl. Für interne Datenübertragung, bei der die Eingabe vertrauenswürdig ist, sind Dataclasses schlanker und haben keine externen Abhängigkeiten.
Wie werden camelCase-JSON-Schlüssel in Python-Dataclasses behandelt?
Python-Konventionen verwenden snake_case für Variablennamen. Der Konverter übersetzt camelCase-Schlüssel wie "firstName" in snake_case-Felder wie first_name. Für die Deserialisierung zurück aus JSON die dataclasses-json-Bibliothek mit einer Konfiguration verwenden, die zwischen den beiden Namenskonventionen abbildet, oder eine eigene __post_init__-Methode schreiben.
Unterstützt der Konverter Python-3.10+-Syntax wie list[str] statt List[str]?
Der Konverter generiert typing-Modul-Imports (List, Optional) für maximale Kompatibilität mit Python 3.7 bis 3.12. Wenn das Projekt auf Python 3.10 oder neuer abzielt, kann List[str] sicher durch list[str] und Optional[str] durch str | None ersetzt werden. Die Typ-Mapping-Tabelle oben zeigt beide Formen.