Zum Hauptinhalt springen

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.

Nur lokal
Struktur
Beispiel-JSON
0 B1 ZeileZ. 1, Sp. 1
Syntaxfehler · Fehler in Zeile 1, Spalte 1

Das Dokument endet zu früh – es scheint abgeschnitten.


^
Generierter Codeschreibgeschützt
0 B1 Zeile
Fügen Sie nach Möglichkeit mehrere Datensätze ein. Nur so werden optionale Felder erkannt, die nicht in jeder Zeile vorkommen.

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] = None

Welche Optionen und Sonderfälle unterstützt JSON in Python umwandeln?

Technische Referenz und Optionen
ParameterTypStandardVerhalten & Sonderfälle
Formdataclass / TypedDict / pydanticdataclassdataclass 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_caseBooleschonBenennt 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 | NoneBooleschoffPython 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.
stringPython-TypstrErkannte 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 / ZahlPython-Typint / floatGetrennt nach dem Vorhandensein eines Bruchteils in einer Stichprobe. Python-Ganzzahlen haben beliebige Genauigkeit, daher gibt es hier keine int64-Unterscheidung.
Optionales FeldAnnotationOptional[T] = NoneIn einem TypedDict ist ein fehlender Schlüssel NotRequired[T], was der Unterschied ist, den Python macht und den die beiden anderen Shapes nicht haben.
FeldreihenfolgeErforderliche zuersterzwungenEin dataclass-Feld ohne Standardwert kann nicht eines mit Standardwert folgen. Erforderliche Felder werden unabhängig von der JSON-Schlüsselreihenfolge zuerst ausgegeben.
Verschachteltes ObjektclassReferenz in AnführungszeichenWird 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.