JSON naar TypeScript / Go / Rust
Plak elke JSON-sample. Krijg schone TypeScript-interfaces, Go-structs of Rust-types met serde-tags — snel, lichtgewicht en klaar om in je code te plakken.
Wat doet deze converter
Loopt door een JSON-sample, infereert een type voor elke waarde en geeft een idiomatic type-definitie in je gekozen taal. Objects worden interfaces (TypeScript), structs (Go, Rust), en geneste objects produceren broer-typedefinities. Arrays van objects voegen hun element-vormen samen — velden in sommige items maar niet andere worden optioneel gemarkeerd, en primitieve waarden die variëren (string in sommige, integer in andere) klappen samen tot een union of serde_json::Value in Rust. Geen data wordt verstuurd — de hele inferrer draait in je browser.
Zo gebruik je het
Plak een representatieve JSON-payload (idealiter één record uit je API-response), kies de doeltaal en kopieer het resultaat. Heeft je JSON meerdere instances van dezelfde vorm (een gepagineerde lijst bijvoorbeeld), neem de array mee — de inferrer leert van variantie. De casing-toggle hernoemt velden in de uitvoer zonder de JSON-keys aan te raken; voor Go en Rust blijft de oorspronkelijke key als struct-tag behouden zodat serialisatie round-trips.
Tips en valkuilen
- Optional vs nullable: een veld dat in sommige records ontbreekt wordt
?/Option<T>, maar een veld overal aanwezig met letterlijkenull-waarde wordt een union metnull— twee verschillende dingen, apart geïnferreerd. - Getallen: integers blijven integers in Go en Rust (
int64,i64); floats wordenfloat64/f64. TypeScript klapt beide samen totnumberomdat de taal niet onderscheidt. - Lege arrays:
[]infereert naarunknown[]/[]interface{}/Vec<serde_json::Value>— drop een sample-item erin voor een echt type. - Veld-hernoemen: alleen de inferrer hernoemt. Je JSON-parser moet keys nog steeds mappen — Go gebruikt de
json:-struct-tag, Rust gebruikt#[serde(rename = ...)].
Veelgestelde vragen
Hoe gaat het om met arrays van gemengde types?
[1, 2, "x"], dan wordt het element-type number | string. Bevat het [{a: 1}, {a: 1, b: 2}], dan wordt het element één object-type met a required en b optioneel. In Go en Rust waar unions geen schoon equivalent hebben, klappen gemengde primitives samen naar interface{} / serde_json::Value.Verwerkt het diep geneste structuren?
Waarom zijn mijn Go-veldnamen PascalCase ook al kies ik behouden?
encoding/json. De originele JSON-key wordt in de json:-tag bewaard, dus serialisatie geeft nog steeds de input-casing.Hoe verschilt dit van zware code-generators?
Compileert mijn uitvoer?
use serde::{Deserialize, Serialize}; voor Rust is inbegrepen; Go's encoding/json is impliciet). Botsen je JSON-keys met gereserveerde woorden na hernoemen, dan gebruikt Rust automatisch r# raw identifiers.Wordt er iets naar een server gestuurd?
JSON.parse van de browser en de inferrer is een kleine recursieve functie op deze pagina. Open DevTools > Network: geen requests tijdens typen. Veilig voor productie-payloads, interne API-responses en alles wat je niet in een gehoste SaaS zou plakken.