Vai al contenuto
Toova
Tutti gli strumenti

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.