JSON in Python umwandeln
Dieses Tool erzeugt aus einem Beispieldokument in Ihrem Browser Dataclasses, TypedDicts oder Pydantic-Modelle. Die drei beantworten verschiedene Fragen: Eine Dataclass beschreibt die Daten ohne Abhängigkeiten, ein TypedDict beschreibt das dict, das json.loads bereits geliefert hat, und ein Pydantic-Modell validiert es an der Grenze.
Das Dokument endet zu früh – es scheint abgeschnitten.
^
Wie funktioniert JSON in Python umwandeln?
Wählen Sie die Form danach, was Sie mit dem Ergebnis vorhaben. Die drei sind nicht austauschbar, und die falsche Wahl ist das häufigste Problem bei generiertem Python.
dataclass, TypedDict, Pydantic
Eine @dataclass gibt Ihnen ein echtes Objekt mit Attributzugriff, Gleichheit und einem nützlichen repr, ohne Drittanbieter-Abhängigkeit – aber sie validiert nichts, sodass ein als int annotiertes Feld gern den String behält, mit dem es konstruiert wurde. Ein TypedDict annotiert das schlichte dict, das json.loads bereits zurückgegeben hat; es muss also gar nichts konstruiert werden, und der Type Checker findet trotzdem einen vertippten Schlüssel – die richtige Antwort, wenn Sie geparstes JSON unverändert weiterreichen. Ein Pydantic BaseModel validiert und konvertiert tatsächlich bei der Konstruktion, was ein API-Client an seiner Grenze will – zum Preis einer Abhängigkeit und etwas Laufzeitarbeit.
Die Feldreihenfolge ist ein Korrektheitsproblem, kein Stilproblem
Ein Dataclass-Feld mit Default darf nicht vor einem ohne stehen: Python wirft TypeError beim Import, nicht bei der ersten Benutzung. Weil optionale Felder = None bekommen, gibt der Generator jedes Pflichtfeld zuerst aus. Ein Generator, der hier die JSON-Schlüsselreihenfolge bewahrt, produziert ein Modul, das sich nicht importieren lässt.
Optional bedeutet „kann None sein“, nicht „kann weggelassen werden“
Genau das bringt Leute in Python durcheinander, denn Optional[int] liest sich, als bedeutete es optional, und meint nullable. In einer Dataclass wird ein Feld, das in manchen Datensätzen fehlt, als Optional[int] = None ausgegeben – die Annotation trägt die Nullbarkeit, der Default das Fehlen. In einem TypedDict sind beide wirklich getrennt: Ein fehlender Schlüssel ist NotRequired[int], ein null-Wert ist Optional[int].
Umbenannte Schlüssel behalten einen Alias
Die Python-Konvention ist snake_case, und JSON von einem JavaScript-Dienst ist das meist nicht. Schlüssel werden umbenannt, und der ursprüngliche Name wird festgehalten – als Kommentar in einer Dataclass oder einem TypedDict, und als echtes Field(alias=…) in Pydantic, wo er das Verhalten ändert, statt es nur zu dokumentieren.
Vorwärtsreferenzen werden in Anführungszeichen gesetzt
Verschachtelte Klassen werden vor den Klassen ausgegeben, die sie verwenden, aber die Annotation wird trotzdem als String geschrieben – so bleibt das Modul importierbar, falls Sie es von Hand umsortieren.
Beispiel
[
{ "userId": 1, "team": "ops" },
{ "userId": 2 }
]Generiert
from dataclasses import dataclass
from typing import Optional
@dataclass
class User:
user_id: int # JSON key: userId
team: Optional[str] = NoneWelche Optionen und Sonderfälle unterstützt JSON in Python umwandeln?
| Parameter | Typ | Standard | Verhalten & Sonderfälle |
|---|---|---|---|
| Form | dataclass / TypedDict / pydantic | dataclass | dataclass für ein objektabhängigkeitsfreies Objekt; TypedDict zur Annotation des dicts, das json.loads zurückgibt; pydantic, wenn Sie die Werte an der Grenze validiert haben möchten. |
| snake_case | Boolesch | on | Benennt Schlüssel um in die Python-Konvention. Bei pydantic wird dies zu einem echten Alias, sodass die Zuordnung immer noch mit dem Wire-Format übereinstimmt; andernfalls wird er in einem Kommentar festgehalten und Sie müssen die Schlüssel selbst zuordnen. |
| X | None | Boolesch | off | Python 3.10+ Union-Syntax anstelle von Optional[X]. Kürzer, und es entfällt der typing-Import – es ist jedoch ein Syntaxfehler in 3.9 und darunter. |
| string | Python-Typ | str | Erkannte Formate werden nicht auf datetime oder UUID abgebildet: json.loads gibt Strings zurück, und das Annotieren eines solchen als datetime wäre eine Lüge, es sei denn, etwas wird es parsen. |
| Integer / Zahl | Python-Typ | int / float | Getrennt nach dem Vorhandensein eines Bruchteils in einer Stichprobe. Python-Ganzzahlen haben beliebige Genauigkeit, daher gibt es hier keine int64-Unterscheidung. |
| Optionales Feld | Annotation | Optional[T] = None | In einem TypedDict ist ein fehlender Schlüssel NotRequired[T], was der Unterschied ist, den Python macht und den die beiden anderen Shapes nicht haben. |
| Feldreihenfolge | Erforderliche zuerst | erzwungen | Ein dataclass-Feld ohne Standardwert kann nicht eines mit Standardwert folgen. Erforderliche Felder werden unabhängig von der JSON-Schlüsselreihenfolge zuerst ausgegeben. |
| Verschachteltes Objekt | class | Referenz in Anführungszeichen | Wird zu seiner eigenen Klasse, vor der Verwendung definiert und durch einen zitierten Forward-Referenz referenziert, damit das Modul bei Neuordnung überlebt. |
Häufig gestellte Fragen
Was soll ich wählen: dataclass, TypedDict oder Pydantic?
Wenn die Daten eine Vertrauensgrenze überschreiten – eine HTTP-Antwort, ein Webhook, eine Datei, die jemand hochgeladen hat –, nehmen Sie Pydantic, denn es ist das einzige der drei, das überhaupt etwas prüft. Wenn Sie bereits geparste dicts annotieren und sie intern weiterreichen, nehmen Sie TypedDict, das zur Laufzeit nichts kostet. Eine Dataclass nehmen Sie, wenn Sie ein echtes Objekt ohne Abhängigkeit wollen – und akzeptieren, dass die Annotationen Dokumentation für Ihren Type Checker sind und keine Garantie.
Warum stehen meine Felder in einer anderen Reihenfolge als in meinem JSON?
Weil ein Dataclass-Feld mit Default nicht hinter einem ohne stehen darf – Python wirft TypeError, wenn das Modul importiert wird, noch bevor irgendeine Ihrer Zeilen Code läuft. Optionale Felder bekommen = None und werden deshalb hinter die Pflichtfelder verschoben. TypedDict und Pydantic kennen diese Regel nicht und behalten die ursprüngliche Reihenfolge.
Bedeutet Optional[int], dass der Schlüssel fehlen kann?
Nein, und das ist die häufigste Fehllesung im Python-Typsystem. Optional[int] bedeutet, dass der Wert None sein darf. Ob der Schlüssel fehlen darf, ist eine separate Frage, ausgedrückt durch einen Default in einer Dataclass oder durch NotRequired in einem TypedDict. Der Generator unterscheidet beides: Ein Schlüssel, der in manchen Datensätzen fehlt, bekommt einen Default; ein Wert, der in manchen Datensätzen null ist, bekommt Optional.
Warum ist mein Zeitstempel str statt datetime?
json.loads gibt einen String zurück; ihn als datetime zu annotieren wäre also falsch, solange nichts ihn parst. In Pydantic können Sie die Annotation auf datetime ändern, und es parst ISO 8601 für Sie – einer der besseren Gründe, sich für Pydantic zu entscheiden. In einer Dataclass oder einem TypedDict ändert eine geänderte Annotation nichts an der Laufzeit und irrt jeden Leser.
Kann ich den generierten TypedDict unter Python 3.9 verwenden?
Ja – der Import stammt aus typing_extensions statt typing, deshalb steht er so im Code. NotRequired ist erst mit 3.11 in die Standardbibliothek gekommen, und typing_extensions portiert es zurück auf jede Version, die überhaupt TypedDict hat. Die Option X | None einzuschalten setzt dagegen tatsächlich 3.10 voraus.
Wird mein JSON hochgeladen?
Nein. Parsen, Inferenz und Rendern geschehen alle in Ihrem Browser; das können Sie im Netzwerk-Panel nachprüfen. Nichts daran, aus einem Beispiel eine Klasse zu erzeugen, braucht einen Server, und die Beispiele, die Leute einfügen, sind meist echte Payloads von einem System, gegen das sie integrieren.
Welche verwandten Tools sollten Sie als Nächstes nutzen?
- JSON in CSV umwandelnDatensätze in eine Tabelle umwandeln, Verschachtelung inklusive
- CSV in JSON umwandelnTabellen-Export in Datensätze umwandeln, Anführungszeichen inklusive
- JSON in String umwandelnEin Dokument zum Einbetten als String-Literal maskieren
- JSON-Escapes auflösenEin Dokument aus Maskierungen in einer Logzeile zurückholen