PK Systems PK Systems
Herramientas para devs

JSON a TypeScript / Go / Rust

Pega cualquier muestra JSON. Recibe interfaces TypeScript limpias, structs Go o tipos Rust con tags serde — rápido, ligero y listo para pegar en tu código.

JSON a TypeScript / Go / Rust

Salida

La salida aparece aquí mientras escribes.

Qué hace este conversor

Recorre una muestra JSON, infiere un tipo para cada valor y emite una definición de tipo idiomática en el lenguaje que elijas. Los objetos se vuelven interfaces (TypeScript), structs (Go, Rust), y los objetos anidados producen definiciones de tipo hermanas. Los arrays de objetos unifican sus shapes de elemento — campos presentes en algunos ítems pero no en otros se marcan opcionales, y valores primitivos que varían (string en algunos ítems, integer en otros) colapsan en una unión o en serde_json::Value en Rust. Ningún dato se envía a ninguna parte — todo el inferrer corre en tu navegador.

Cómo usar

Pega un payload JSON representativo (idealmente un registro de la respuesta de tu API), elige el lenguaje destino y copia el resultado. Si tu JSON tiene múltiples instancias del mismo shape (una lista paginada, por ejemplo), incluye el array — el inferrer aprende más con la varianza. El toggle de casing renombra los campos en la salida sin tocar las llaves del JSON; en Go y Rust la llave original se preserva como tag de struct, así la serialización hace round-trip.

Tips y trampas

  • Opcional vs nullable: un campo faltante en algunos registros se vuelve ? / Option<T>, pero un campo presente en todos lados con valor literal null se vuelve unión con null — son distintos y se infieren por separado.
  • Números: los integers permanecen integers en Go y Rust (int64, i64); los floats se vuelven float64 / f64. TypeScript colapsa ambos a number porque el lenguaje no distingue.
  • Arrays vacíos: [] infiere a unknown[] / []interface{} / Vec<serde_json::Value> — agrega un ítem de muestra para conseguir un tipo real.
  • Renombrado de campos: solo el inferrer renombra. Tu parser JSON aún necesita mapear las llaves — Go usa el tag json:, Rust usa #[serde(rename = ...)].

Preguntas frecuentes

¿Cómo maneja arrays de tipos mixtos?
Unifica los shapes de elemento. Si un array contiene [1, 2, "x"], el tipo del elemento se vuelve number | string. Si contiene [{a: 1}, {a: 1, b: 2}], el elemento se vuelve un tipo objeto con a requerido y b opcional. En Go y Rust donde las uniones no tienen equivalente limpio, los primitivos mixtos colapsan a interface{} / serde_json::Value.
¿Maneja estructuras profundamente anidadas?
Sí — no hay límite de profundidad. Cada objeto anidado se nombra por su llave padre (capitalizado, singularizado cuando el padre es plural), y una tabla interna previene colisiones de nombres añadiendo sufijo numérico. Estructuras autorreferenciales como árboles no se auto-detectan; podrías necesitar fusionar dos tipos generados a mano si tus datos forman un ciclo.
¿Por qué mis nombres de campo Go están en PascalCase aunque elegí preservar?
Go requiere que los campos exportados de un struct empiecen con mayúscula — es regla del lenguaje, no opción de estilo. Nombres en minúscula serían privados e invisibles para encoding/json. La llave original del JSON se preserva en el tag json:, así la serialización aún produce el casing de entrada.
¿En qué se diferencia de los generadores de código más pesados?
Los generadores corporativos soportan decenas de lenguajes, entrada por JSON Schema, uniones discriminadas, enums con nombre y refinamiento en varias pasadas — útil cuando tienes un schema formal y un equipo grande. Esta herramienta es un inferrer ligero, sin ceremonia, con salida en TypeScript, Go y Rust y cero configuración. Para flujos one-shot de "dame un tipo para esta respuesta de API", aquí es más rápido y la salida es más fácil de leer y editar a mano.
¿Mi salida compilará?
Casi siempre sí para TypeScript. La salida Go y Rust también es compilable tal cual, pero podrías necesitar añadir los imports correctos (use serde::{Deserialize, Serialize}; para Rust ya viene incluido; encoding/json en Go es implícito). Si las llaves de tu JSON colisionan con palabras reservadas tras renombrar, Rust usa identificadores raw r# automáticamente.
¿Algo se envía a un servidor?
No. El parser es el JSON.parse del navegador y el inferrer es una pequeña función recursiva en esta página. Abre DevTools > Network y no verás ninguna petición mientras escribes. Seguro para payloads de producción, respuestas de API internas y cualquier cosa que no pegarías en un SaaS hospedado.