100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in Python — Pydantic, dataclass o TypedDict

Trasforma un campione JSON in classi Python. Scegli lo stile che il progetto usa già e incolla il risultato così com’è dentro models.py, senza ritocchi.

Istantaneo Privato Zero cookie
Stile

Input JSON

Output Python

Che cosa fa questo strumento

Un campione JSON diventa classi Python, una per oggetto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
from pydantic import BaseModel, Field


class Address(BaseModel):
    city: str


class Root(BaseModel):
    id: int
    first_name: str = Field(alias="firstName")
    address: Address

I figli sono dichiarati per primi: una classe deve esistere prima che un’altra annoti un campo con essa. L’uscita punta a un Python moderno — list[str] e int | str sono scritti direttamente, il che richiede 3.10 o successivo.

Tre stili, tre costi diversi

stileche cosa ti dàche cosa costa
Pydanticla validazione al confine, alias per le chiavi rinominateuna dipendenza, e oggetti non semplici
dataclassun contenitore semplice, sola libreria standardnessuna validazione e nessun alias per una chiave rinominata
TypedDictannotazioni per i dizionari che hai giànulla a runtime — e quindi nessun controllo

La struttura è identica nei tre; cambia quanto il tipo fa per te.

Le parole riservate non rompono più il file

{"class": 1} produceva:

class Root(BaseModel):
    class: int

che non è Python — il file non si analizza nemmeno. Le parole riservate prendono ora un trattino basso, e l’alias Pydantic conserva la chiave:

    class_: int = Field(alias="class")

Era un difetto vero, trovato scrivendo questa pagina e corretto. TypedDict se la cava altrimenti: una chiave che non può essere un nome di attributo fa passare l’intera definizione alla sintassi funzionale, Root = TypedDict('Root', {"class": int}), dove le chiavi sono stringhe e tutto passa.

Ciò che un campione non può dirti

Nulla è | None e nulla ha un valore predefinito: ogni campo è obbligatorio, perché il campione lo conteneva. Un null dà il tipo None, che non accetta altro — se il campo è «una stringa, a volte nulla», la modifica è str | None, e = None se può mancare.

Due chiavi che danno lo stesso snake_case — fooBar e foo_bar — restano distinte con un suffisso numerato invece di fondersi, e l’alias registra quale fosse quale.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Quale dei tre stili scegliere?
Pydantic se il dato viene da fuori e vuoi validarlo al confine. `dataclass` se è già affidabile e basta un contenitore semplice. `TypedDict` se stai annotando dizionari che hai già, senza toccare il codice a runtime. La struttura dedotta è la stessa; cambia solo quanto costa.
Perché la mia chiave è rinominata, e dov’è finita?
Gli attributi Python sono in snake_case: `firstName` diventa `first_name`. Nello stile Pydantic la chiave originale è conservata da `Field(alias="firstName")`, e l’analisi continua a funzionare. `dataclass` non ha alias da offrire — resta il solo nome — e `TypedDict` conserva la chiave grezza, passando alla sintassi funzionale quando una chiave non è un nome utilizzabile.
Che fine fa una chiave chiamata `class` o `def`?
Prende un trattino basso: `class_`, `def_`, con `Field(alias="class")` in Pydantic. Emettere `class: int` produceva un file che Python nemmeno analizza — era un difetto vero, trovato scrivendo questa pagina e corretto. `TypedDict` aggira la questione scrivendo `TypedDict('Root', {"class": int})`.

Convertitori correlati