JSON in Dataclass Python

Incolla un campione JSON e ottieni un @dataclass (o BaseModel di Pydantic) con suggerimenti di tipo per ogni campo, str, int, float, bool, Optional[...] e List[...] dove appropriato. Gli oggetti annidati diventano le proprie dataclass. L’output è formattato secondo PEP 8 e pronto per essere incollato in un file Python.

Come convertire JSON in una dataclass

  1. 1

    Incolla il JSON

    Un singolo campione funziona; più campioni migliorano il rilevamento della nullabilità.

  2. 2

    Scegli lo stile

    Libreria standard `@dataclass`, Pydantic `BaseModel`, o `TypedDict` solo per il controllo statico dei tipi.

  3. 3

    Scegli la versione di Python

    3.9+ per la sintassi `list[str]`, 3.10+ per i tipi unione `|`, 3.8 per `Optional[...]` / `List[...]`.

  4. 4

    Copia il codice

    Una classe radice più quelle annidate. Incolla in un file `.py` e importa.

Esempio di output: standard @dataclass

Input:

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

Output (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

Stesso input con Pydantic

from typing import Optional
from pydantic import BaseModel


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

Mappatura dei tipi

Valore JSON Tipo Python
stringa str
intero int
numero (decimale) float
booleano bool
null (visto da solo) None
null + altro tipo Optional[T]
stringa data ISO date (Python 3.7+)
data e ora ISO datetime
array di un tipo list[T]
array misto list[Union[T1, T2]]
oggetto Classe annidata

Dataclass vs Pydantic vs TypedDict

Tipo Quando usarlo
@dataclass Soluzione della libreria standard, senza validazione runtime
Pydantic Validazione e coercizione runtime (FastAPI, impostazioni)
TypedDict Solo per il controllo statico dei tipi, senza classe di istanza
attrs Progetti legacy che si sono standardizzati su attrs

Errori comuni

  • Dimenticare default_factory per i valori mutabili. Un valore predefinito list[str] = [] è una trappola per dataclass (condiviso tra le istanze). Usa field(default_factory=list).
  • Opzionale senza predefinito. email: Optional[str] senza = None richiede comunque l’argomento. Abbina la semantica del tuo JSON.
  • Pydantic v1 vs v2. La sintassi e i comportamenti differiscono (classe Config vs model_config, validator vs field_validator). Il generatore predefinito è v2.
  • L’ordine dell’unione è importante per la deserializzazione. Pydantic prova i tipi nell’ordine di dichiarazione. Metti il più specifico per primo (ad es. int prima di str) se l’ambiguità è possibile.

Domande frequenti

Dataclass per semplici contenitori di valori senza validazione. Pydantic quando desideri validazione runtime, coercizione o integrazione con FastAPI. TypedDict quando hai solo bisogno di controllo statico dei tipi (mypy, pyright) e non vuoi istanze di classe.

Non per Python 3.10+ dove le unioni | e la sintassi list[str] sono native. Utile per progetti 3.7-3.9 per utilizzare la sintassi più recente tramite le annotazioni di stringa PEP 563. Il generatore avvisa quando è necessario.

Ogni oggetto annidato diventa la propria classe. La classe radice li fa riferimento per nome, quindi puoi riutilizzare i tipi. Riferimenti circolari vengono rilevati e segnalati.

Sì, se scegli il tipo Pydantic. FastAPI utilizza i modelli Pydantic come tipi di richiesta/riposta direttamente. Per lo spostamento interno dei dati, @dataclass è più leggero.

Strumenti correlati

Strumento disponibile in altre lingue