JSON naar Python-dataclass

Plak een JSON-voorbeeld en krijg een @dataclass (of Pydantic BaseModel) met typeaanduidingen voor elk veld, str, int, float, bool, Optional[...] en List[...] waar van toepassing. Geneste objecten worden hun eigen dataclasses. De uitvoer is in PEP 8-formaat en klaar om in een Python-bestand te worden geplakt.

Hoe je JSON omzet in een dataclass

  1. 1

    Plak de JSON

    Eén enkel voorbeeld volstaat; meerdere voorbeelden verbeteren de detectie van welke velden nullable kunnen zijn.

  2. 2

    Kies een stijl

    Standaardbibliotheek `@dataclass`, Pydantic `BaseModel` of `TypedDict` voor alleen statische typencontrole.

  3. 3

    Kies de Python-versie

    3,9+ voor de syntaxis van `list[str]`, 3,10+ voor de unietypen van `|`, en 3,8 voor `Optional[...]`/`List[...]`.

  4. 4

    Kopieer de code

    Een basisklasse met ingebedde klassen. Plak deze in een `.py`-bestand en importeer ze.

Voorbeelduitvoer: standaard @dataclass

Invoer:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Uitvoer (Python 3.10+):

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class User:
    first_name: str
    age: int
    tags: list[str] = field(default_factory=list)
    email: Optional[str] = None

Dezelfde invoer met Pydantic

from typing import Optional
from pydantic import BaseModel


class User(BaseModel):
    first_name: str
    age: int
    email: Optional[str] = None
    tags: list[str] = []

Type-mapping

JSON-waarde Python-type
string str
gehele getal int
nummer (decimaal) float
booleaanse waarde bool
null (alleen weergegeven) None
null + andere type Optional[T]
ISO-datumstring date (Python 3.7+)
ISO-datum en tijd datetime
array van één type list[T]
gemengde matrix list[Union[T1, T2]]
object geneste klasse

Dataclass versus Pydantic versus TypedDict

Variant Wanneer gebruiken
@dataclass Oplossing uit de standaardbibliotheek, zonder validatie tijdens uitvoering
Pydantic Validatie en coerceren tijdens uitvoering (FastAPI, instellingen)
TypedDict Enkel statische typencontrole, geen instancieklassen
attrs Legacyprojecten die zijn gestandaardiseerd naar attrs

Veelvoorkomende fouten

  • default_factory vergeten voor veranderlijke standaardwaarden. Een standaardwaarde list[str] = [] is een valkuil voor dataclasses (wordt gedeeld tussen instanties). Gebruik field(default_factory=list).
  • Optional zonder standaardwaarde. email: Optional[str] zonder = None vereist nog steeds het argument. Stem dit af op de semantiek van uw JSON.
  • Pydantic v1 versus v2. De syntaxis en het gedrag verschillen (klasse Config versus model_config, validator versus field_validator). De generator gebruikt standaard versie v2.
  • De volgorde in de union is belangrijk voor de deserialisatie. Pydantic probeert de typen in de declaratievolgorde; plaats daarom het meest specifieke type eerst (bijvoorbeeld int vóór str) als dubbelzinnigheid mogelijk is.

Veelgestelde vragen

Dataclass voor eenvoudige waardehouders zonder validatie. Pydantic wanneer u tijdens uitvoering validatie, coercentie of FastAPI-integratie nodig hebt. TypedDict wanneer u alleen statische typencontrole vereist (bijvoorbeeld met mypy of pyright) en geen klasseninstansen wilt gebruiken.

Niet nodig voor Python 3.10+, waar de |-unions en de list[str]-syntaxis native zijn. Handig voor projecten van versie 3.7 tot 3.9 om de nieuwere syntaxis te gebruiken via PEP 563-stringannotaties. De generator waarschuwt wanneer dit nodig is.

Elk geneste object vormt een eigen klasse. De wortelklasse verwijst naar deze objecten via hun namen, zodat typen kunnen worden hergebruikt. Cirkulaire referenties worden gedetecteerd en gemarkeerd.

Ja, als u de Pydantic-versie kiest: FastAPI gebruikt Pydantic-modellen rechtstreeks als type voor verzoeken en antwoorden. Voor interne gegevensverwerking is @dataclass lichter in ontwerp.

Gerelateerde tools

Tool beschikbaar in andere talen