JSON a TypeScript, Go, Python, PHP, Rust
Privacy by design — tutto gira nel tuo browser
Inferire le definizioni di tipi corrette da una risposta API reale è uno di quei lavori che dovrebbero richiedere cinque secondi ma finiscono per mangiarne quindici. Questo strumento legge un campione JSON nel tuo browser, percorre la struttura e produce tipi idiomatici per TypeScript, Go, Python, PHP o Rust — con campi opzionali, rilevamento di date ISO e corretta distinzione tra intero e float.
Come funziona l'inferenza
Lo strumento percorre l'albero JSON una sola volta costruendo una rappresentazione intermedia: i primitivi diventano string / int / float / bool / null, gli array inferiscono il tipo dell'elemento dall'unione dei membri, e gli oggetti producono una struct dove i tipi dei campi derivano dai valori. Se un campo compare in alcuni elementi dell'array e in altri no, viene marcato opzionale — il tipo generato decodifica dati parziali senza rompere. I numeri senza parte frazionaria escono come int64 (Go) / int (Python) / i64 (Rust); quelli con parte frazionaria come float64 / float / f64. Le stringhe in formato ISO 8601 (`2024-03-15T10:30:00Z`) diventano Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.
Stile di output per linguaggio
Ogni emettitore segue le convenzioni del linguaggio target. TypeScript: interfacce esportate con sintassi `?:`. Go: struct con tag `json:`, opzionali come puntatore con `omitempty`. Python: `@dataclass` con campi obbligatori prima e `Optional[T] = None` alla fine (regola di ordinamento dataclass). PHP: classi final con tipi stretti e annotazioni `@var list<T>` per array tipizzati. Rust: struct con `#[derive(Serialize, Deserialize)]`, `Option<T>` per campi nullable e `#[serde(rename)]` quando il nome snake_case in Rust differisce dalla chiave JSON.
Quando usarlo (e quando no)
Il generatore risolve il primo 80% del lavoro: ottenere una definizione di tipi funzionante da un payload in secondi. Non sostituisce uno schema scritto a mano quando servono vincoli precisi (regex sulle stringhe, min/max sui numeri, unioni discriminate). In quei casi, parti dall'output e stringi i tipi. Il rilevamento opzionali è euristico — basato su ciò che è presente nel campione — quindi passa più campioni diversi se possibile.
Domande frequenti
- Il JSON che incollo esce dal mio browser?
- No. Parser, inferenza e generazione girano in JavaScript dentro la tua scheda. Apri il pannello Rete mentre generi — zero richieste in uscita. Sicuro per payload di produzione con token reali e PII.
- Perché il mio campo è opzionale se ha sempre un valore?
- Il flag opzionale scatta quando un array contiene oggetti con il campo e altri senza. Se incolli un singolo oggetto, nulla viene marcato opzionale. Se incolli un array di oggetti identici, neanche. Il flag si attiva solo quando la struttura dentro l'array varia.
- Come distingue intero e float?
- JSON ha un solo tipo numerico. Lo strumento ispeziona ogni valore e produce int quando il valore non ha parte frazionaria (`42`, `1000`) e float quando la ha (`3.14`, `99.0`). Se un array mescola i due, il tipo si allarga a float per evitare decodifica con perdita.
- Rileva stringhe di data ISO?
- Sì. Le stringhe nel pattern `YYYY-MM-DD` o `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` escono come tipo nativo data/ora del linguaggio (Date in TS, time.Time in Go, datetime in Python, DateTimeInterface in PHP, chrono::DateTime in Rust). Altri formati rimangono stringhe.
- Devo installare qualcosa per usare il codice generato?
- TypeScript: nulla, è puro. Go: solo la libreria standard (time.Time quando ci sono date ISO). Python: modulo dataclasses standard. PHP: tipi nativi. Rust: serde + chrono se ci sono date ISO. Header/import vengono scritti nell'output dove applicabile.
- Posso generare tipi per un array di oggetti come root?
- Sì. Se la radice è un array di oggetti, lo strumento produce una struct per l'elemento e un alias di tipo a livello superiore per l'array. Per esempio, un JSON `[{...}, {...}]` chiamato `Users` produce `User` più `type Users = User[];` in TypeScript, o `pub type Users = Vec<User>;` in Rust.