JSON to Python

Generování Python dataclass definic z JSON

Zkusit příklad
Název kořenové třídy:

Vstup JSON

Výstup Python

Běží lokálně · Bezpečné pro vkládání tajných údajů
Python dataclasses se zobrazí zde…

Co je převod JSON na Python dataclass?

Převod JSON na Python dataclass vezme surový JSON objekt a vyprodukuje sadu definic Python dataclass s přesnými typovými anotacemi. Modul dataclasses, představený v PEP 557 (Python 3.7), generuje metody __init__, __repr__ a __eq__ z anotovaných polí třídy. Při práci s JSON API, konfiguračními soubory nebo frontami zpráv vám dataclasses dávají datům typovanou strukturu, kterou mohou editory a typové kontroly jako mypy ověřovat při vývoji.

Funkce json.loads() vrací prosté slovníky a seznamy. Ty fungují, ale nemají žádné informace o typech: překlep v klíči vrátí None místo vyvolání výjimky a editor nemůže doplňovat názvy polí. Dataclasses tento problém řeší mapováním každého klíče JSON na pojmenované, typované pole. Vnořené JSON objekty se stávají samostatnými definicemi dataclass, pole se stávají anotacemi List[T] a hodnoty null se stávají Optional[T] s výchozí hodnotou None.

Ruční psaní těchto definic je mechanická práce. Musíte si přečíst JSON, zjistit typ každého pole z jeho hodnoty, převést klíče z camelCase nebo snake_case do konvencí Pythonu a ošetřit hraniční případy jako nulovatelná pole a pole se smíšenými typy. Převodník toto vše zvládne v milisekundách. Vložíte JSON, získáte správný kód dataclass a pokračujete dále.

Proč používat převodník JSON na Python?

Ruční překlad JSON struktur do Python definic tříd znamená odhadovat typy ze vzorových dat, přeuspořádávat pole tak, aby povinná přicházela před volitelnými, a aktualizovat vše při změně API. Převodník toto tření odstraňuje.

Okamžité generování dataclass
Vložte JSON a získejte typované definice Python dataclass za méně než sekundu. Vnořené objekty, seznamy a volitelná pole jsou zpracovány automaticky.
🔒
Zpracování s ochranou soukromí
Převod probíhá zcela ve vašem prohlížeči pomocí JavaScriptu. Váš JSON nikdy neopustí vaše zařízení. API klíče, tokeny a záznamy uživatelů zůstávají soukromé.
📝
Správné typové anotace
Každé vygenerované pole obsahuje typovou anotaci Pythonu odvozenou z hodnoty JSON: str, int, float, bool, List[T] nebo Optional[T] pro null hodnoty.
📦
Bez instalace nebo registrace
Otevřete stránku a vložte JSON. Nevyžaduje se žádné Python prostředí, žádné pip balíčky k instalaci, žádný účet k vytvoření.

Případy použití JSON na Python

Vývoj REST API klientů
Generujte dataclasses z vzorků API odpovědí. Vložte JSON vrácený koncovým bodem třetí strany a získejte typově bezpečné Python třídy připravené pro requests nebo httpx.
Modely FastAPI požadavků a odpovědí
Začněte od tvaru JSON payloadu a vygenerujte definice dataclass. Převeďte je na Pydantic modely a získejte automatickou validaci v obslužných rutinách tras FastAPI.
Schémata datových pipeline
Definujte typované struktury záznamů pro ETL pipeline. Vložte vzorovou JSON zprávu z Kafka, RabbitMQ nebo SQS a vygenerujte dataclasses dokumentující očekávaný tvar.
Parsování konfiguračních souborů
Převeďte JSON konfigurační soubory na typované Python třídy. Načtěte konfiguraci pomocí json.load() a pak vytvořte instanci dataclass pro doplňování kódu editorem a typovou kontrolu.
Generování testovacích přípravků
Vytvářejte typované přípravky ze vzorových JSON dat. Testeři mohou vložit snímky API odpovědí a vyprodukovat definice dataclass pro použití v pytest testovacích sadách.
Výuka typových anotací Pythonu
Studenti mohou vložit libovolnou JSON strukturu a vidět, jak ji Python reprezentuje s typovými nápovědami. Vygenerovaný kód ukazuje List, Optional, vnořené třídy a výchozí hodnoty v kontextu.

Mapování typů JSON na Python

Každá hodnota JSON se mapuje na konkrétní typovou anotaci Pythonu. Tabulka níže ukazuje, jak převodník překládá každý typ JSON, a to jak syntaxí modulu typing (Python 3.7+), tak vestavěnou syntaxí dostupnou od Pythonu 3.10 výše.

Typ JSONPříkladPython (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]

Přehled dekorátoru dataclass

Dekorátor @dataclass přijímá několik parametrů, které mění chování generované třídy. Tento přehled pokrývá možnosti nejrelevantnější při práci s daty odvozenými z JSON.

Dekorátor / PoleChováníPoužít, když
@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 má tři běžné způsoby definování typovaných struktur z JSON. Každý se hodí pro jiný případ použití. Dataclasses jsou variantou standardní knihovny bez závislostí. Pydantic přidává validaci za běhu. TypedDict anotuje prosté slovníky bez vytváření nové třídy.

@dataclass
Standardní knihovna (Python 3.7+). Generuje metody __init__, __repr__ a __eq__. Žádná validace za běhu. Funguje s mypy a dataclasses-json pro serializaci. Nejlepší pro interní datové struktury, kde kontrolujete vstup.
BaseModel (Pydantic)
Knihovna třetí strany. Validuje typy a omezení za běhu. Parsuje JSON přímo přes model_validate_json(). Standardní volba pro FastAPI, správu nastavení a jakýkoli kód přijímající nedůvěryhodný vstup.
TypedDict
Standardní knihovna (Python 3.8+). Přidává typové nápovědy k běžným slovníkům. Negeneruje metody __init__ ani jiné metody. Hodnoty zůstávají dostupné jako přístup ke slovníku. Použijte, když potřebujete typovou kontrolu, ale chcete zachovat rozhraní slovníku, například v starších kódových základnách.

Příklady kódu

Tyto příklady ukazují, jak používat vygenerované dataclasses v Pythonu, jak je programově vytvářet z JavaScriptu a jak používat alternativní přístupy jako Pydantic a CLI nástroje.

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]

Časté dotazy

Jaký je rozdíl mezi Python dataclass a běžnou třídou?
Dataclass používá dekorátor @dataclass k automatickému generování metod __init__, __repr__ a __eq__ z anotací polí. Běžná třída vyžaduje, abyste tyto metody napsali sami. Dataclasses snižují standardní kód, když třída primárně uchovává data, což je typický případ pro struktury odvozené z JSON.
Mohu použít dataclasses přímo se serializací JSON?
Standardní modul json nemůže ve výchozím nastavení serializovat instance dataclass. Použijte dataclasses.asdict() k převodu dataclass na slovník a pak jej předejte do json.dumps(). Pro větší kontrolu knihovna dataclasses-json přidává metody .to_json() a .from_json(), a Pydantic modely zvládají serializaci nativně.
Jak převodník zpracovává vnořené JSON objekty?
Každý vnořený objekt se stává samostatnou definicí @dataclass. Pokud JSON pole s názvem "address" obsahuje objekt s poli "street" a "city", převodník vytvoří dataclass Address a anotuje nadřazené pole jako address: Address. Hluboce vnořené struktury vytvářejí více definic dataclass v pořadí závislostí.
Co se stane, když je JSON pole null?
Pole s hodnotou null jsou anotována jako Optional[str] (nebo příslušný typ, pokud jej lze odvodit z kontextu) s výchozí hodnotou None. Pole s výchozími hodnotami musí přicházet za povinnými poli v dataclass, takže převodník umisťuje volitelná pole na konec definice třídy.
Je rozdíl mezi dataclasses a Pydantic modely pro JSON?
Dataclasses jsou součástí standardní knihovny a za běhu nevalidují data. Pydantic modely validují typy, vynucují omezení a mohou přímo parsovat surové JSON řetězce. Pokud přijímáte JSON z externích zdrojů a potřebujete odmítat chybně formátovaná data, Pydantic je lepší volbou. Pro interní předávání dat, kde důvěřujete vstupu, jsou dataclasses lehčí a nemají žádné externí závislosti.
Jak zacházet s camelCase klíči JSON v Python dataclasses?
Pythonská konvence používá snake_case pro názvy proměnných. Převodník překládá camelCase klíče jako "firstName" na snake_case pole jako first_name. Pokud potřebujete deserializaci zpět z JSON, použijte knihovnu dataclasses-json s konfigurací, která mapuje mezi oběma konvencemi pojmenování, nebo napište vlastní metodu __post_init__.
Podporuje tento převodník syntaxi Pythonu 3.10+, jako je list[str] místo List[str]?
Převodník generuje importy modulu typing (List, Optional) pro maximální kompatibilitu s Pythonem 3.7 až 3.12. Pokud váš projekt cílí na Python 3.10 nebo novější, můžete bezpečně nahradit List[str] za list[str] a Optional[str] za str | None. Tabulka mapování typů výše ukazuje obě formy.