JSON to Python

Python dataclasses genereren vanuit JSON

Probeer een voorbeeld
Naam rootklasse:

JSON-invoer

Python-uitvoer

Draait lokaal · Veilig om secrets te plakken
Python dataclasses verschijnen hier…

Wat is JSON naar Python Dataclass-conversie?

JSON naar Python dataclass-conversie neemt een raw JSON-object en produceert een set Python-dataclassedefinities met nauwkeurige type-annotaties. De dataclasses-module van Python, geïntroduceerd in PEP 557 (Python 3.7), genereert __init__-, __repr__- en __eq__-methoden vanuit geannoteerde klassevelden. Wanneer je werkt met JSON API's, configuratiebestanden of berichtenwachtrijen, geven dataclasses je data een getypeerde structuur die editors en typecheckers zoals mypy al tijdens de ontwikkeling kunnen verifiëren.

De methode json.loads() van Python geeft gewone dicts en lijsten terug. Die werken, maar ze bevatten geen type-informatie: een verkeerd gespelde sleutel geeft None terug in plaats van een foutmelding, en je editor kan veldnamen niet automatisch aanvullen. Dataclasses lossen dit op door elke JSON-sleutel te koppelen aan een benoemd, getypeerd veld. Geneste JSON-objecten worden afzonderlijke dataclassedefinities, arrays worden List[T]-annotaties en null-waarden worden Optional[T] met een standaardwaarde van None.

Deze definities met de hand schrijven is mechanisch werk. Je leest de JSON, bepaalt het type van elk veld op basis van de waarde, converteert sleutels van camelCase of snake_case naar Python-conventies en behandelt randgevallen zoals nullable velden en arrays met gemengde typen. Een converter doet dit alles in milliseconden. Je plakt JSON, krijgt correcte dataclass-code terug en gaat verder.

Waarom een JSON naar Python-converter gebruiken?

JSON-structuren handmatig vertalen naar Python-klassedefinities betekent typen raden op basis van voorbeelddata, velden herordenen zodat verplichte vóór optionele komen, en alles bijwerken wanneer de API verandert. Een converter neemt die moeite weg.

Directe dataclass-generatie
Plak je JSON en ontvang getypeerde Python-dataclassedefinities in minder dan een seconde. Geneste objecten, lijsten en optionele velden worden automatisch verwerkt.
🔒
Privacy-eerst verwerking
De conversie vindt volledig in je browser plaats via JavaScript. Je JSON verlaat je machine nooit. API-sleutels, tokens en gebruikersgegevens blijven privé.
📝
Correcte type-annotaties
Elk gegenereerd veld bevat een Python-type-annotatie afgeleid van de JSON-waarde: str, int, float, bool, List[T] of Optional[T] voor null-waarden.
📦
Geen installatie of aanmelding
Open de pagina en plak je JSON. Geen Python-omgeving vereist, geen pip-pakketten te installeren, geen account aan te maken.

Gebruiksscenario's voor JSON naar Python

REST API-clientontwikkeling
Genereer dataclasses vanuit API-responsvoorbeelden. Plak de JSON die een extern REST-endpoint retourneert en ontvang typeveilige Python-klassen die klaar zijn voor gebruik met requests of httpx.
FastAPI Request/Response-modellen
Begin met een JSON-payload-structuur en genereer dataclassedefinities. Converteer ze naar Pydantic-modellen voor automatische validatie in FastAPI-routehandlers.
Data Pipeline-schema's
Definieer getypeerde recordstructuren voor ETL-pipelines. Plak een voorbeeld-JSON-bericht uit Kafka, RabbitMQ of SQS en genereer dataclasses die de verwachte structuur documenteren.
Configuratiebestanden verwerken
Zet JSON-configuratiebestanden om naar getypeerde Python-klassen. Laad je configuratie met json.load() en maak vervolgens een dataclass-instantie voor editor-aanvulling en typecontrole.
Testfixtures genereren
Maak getypeerde fixtures vanuit voorbeeld-JSON-data. QA-engineers kunnen API-response-snapshots plakken en dataclassedefinities produceren voor gebruik in pytest-testsuites.
Python-type-annotaties leren
Studenten kunnen elke JSON-structuur plakken en zien hoe Python die weergeeft met type-hints. De gegenereerde code toont List, Optional, geneste klassen en standaardwaarden in context.

JSON naar Python-typemapping

Elk JSON-waardetype wordt gekoppeld aan een specifieke Python-type-annotatie. De tabel hieronder laat zien hoe de converter elk JSON-type vertaalt, met zowel de typing-modulesyntaxis (Python 3.7+) als de ingebouwde syntaxis beschikbaar vanaf Python 3.10.

JSON-typeVoorbeeldPython (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-referentie

De @dataclass-decorator accepteert verschillende parameters die het gedrag van de gegenereerde klasse bepalen. Deze referentie behandelt de opties die het meest relevant zijn bij het werken met JSON-afgeleide data.

Decorator / VeldGedragGebruik wanneer
@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 heeft drie gangbare manieren om getypeerde structuren te definiëren vanuit JSON. Elk past bij een ander gebruiksscenario. Dataclasses zijn de standaardbibliotheekoptie zonder externe afhankelijkheden. Pydantic voegt runtime-validatie toe. TypedDict annoteert gewone dicts zonder een nieuwe klasse te maken.

@dataclass
Standaardbibliotheek (Python 3.7+). Genereert __init__, __repr__ en __eq__. Geen runtime-validatie. Werkt met mypy en dataclasses-json voor serialisatie. Geschikt voor interne datastructuren waarbij je de invoer beheert.
BaseModel (Pydantic)
Externe bibliotheek. Valideert typen en beperkingen tijdens runtime. Verwerkt JSON direct via model_validate_json(). Standaardkeuze voor FastAPI, configuratiebeheer en code die niet-vertrouwde invoer ontvangt.
TypedDict
Standaardbibliotheek (Python 3.8+). Voegt type-hints toe aan gewone dicts. Geen __init__ of methoden gegenereerd. Waarden blijven toegankelijk als gewone dict. Gebruik wanneer je typecontrole wilt maar de dict-interface wilt behouden, zoals in oudere codebases.

Codevoorbeelden

Deze voorbeelden laten zien hoe je gegenereerde dataclasses in Python gebruikt, hoe je ze programmatisch vanuit JavaScript produceert en hoe je alternatieve benaderingen zoals Pydantic en CLI-tools kunt gebruiken.

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]

Veelgestelde vragen

Wat is het verschil tussen een Python-dataclass en een gewone klasse?
Een dataclass gebruikt de @dataclass-decorator om automatisch __init__-, __repr__- en __eq__-methoden te genereren vanuit veldannotaties. Bij een gewone klasse moet je deze methoden zelf schrijven. Dataclasses verminderen boilerplate wanneer de klasse voornamelijk data bevat, wat het typische geval is voor JSON-afgeleide structuren.
Kan ik dataclasses direct gebruiken voor JSON-serialisatie?
De json-module uit de standaardbibliotheek kan dataclass-instanties standaard niet serialiseren. Gebruik dataclasses.asdict() om een dataclass naar een dict te converteren en geef dat door aan json.dumps(). Voor meer controle voegt de dataclasses-json-bibliotheek .to_json()- en .from_json()-methoden toe, en Pydantic-modellen verwerken serialisatie van nature.
Hoe verwerkt de converter geneste JSON-objecten?
Elk genest object wordt een afzonderlijke @dataclass-definitie. Als een JSON-veld met de naam "address" een object bevat met "street" en "city", maakt de converter een Address-dataclass en annoteert het bovenliggende veld als address: Address. Diep geneste structuren produceren meerdere dataclassedefinities in afhankelijkheidsvolgorde.
Wat gebeurt er wanneer een JSON-veld null is?
Null-velden worden geannoteerd als Optional[str] (of het juiste type als dit uit de context kan worden afgeleid) met een standaardwaarde van None. Velden met standaardwaarden moeten na verplichte velden komen in een dataclass, dus de converter plaatst optionele velden aan het einde van de klassedefinitie.
Is er een verschil tussen dataclasses en Pydantic-modellen voor JSON?
Dataclasses maken deel uit van de standaardbibliotheek en valideren data niet tijdens runtime. Pydantic-modellen valideren typen, handhaven beperkingen en kunnen raw JSON-strings direct verwerken. Als je JSON ontvangt van externe bronnen en misvormde data wilt afwijzen, is Pydantic de betere keuze. Voor intern doorgeven van data waarbij je de invoer vertrouwt, zijn dataclasses lichter en hebben ze geen externe afhankelijkheden.
Hoe ga ik om met camelCase JSON-sleutels in Python-dataclasses?
Python-conventie gebruikt snake_case voor variabelenamen. De converter vertaalt camelCase-sleutels zoals "firstName" naar snake_case-velden zoals first_name. Als je terug moet deserialiseren vanuit JSON, gebruik dan de dataclasses-json-bibliotheek met een configuratie die tussen de twee naamgevingsconventies koppelt, of schrijf een aangepaste __post_init__-methode.
Ondersteunt deze converter Python 3.10+-syntaxis zoals list[str] in plaats van List[str]?
De converter genereert typing-module-imports (List, Optional) voor maximale compatibiliteit met Python 3.7 tot en met 3.12. Als je project Python 3.10 of later als doelversie heeft, kun je List[str] veilig vervangen door list[str] en Optional[str] door str | None. De typemappingtabel hierboven toont beide vormen.