PK Systems PK Systems
Ferramentas para devs

JSON para TypeScript / Go / Rust

Cole qualquer amostra JSON. Receba interfaces TypeScript limpas, structs Go ou tipos Rust com tags serde — rápido, leve e pronto para colar no seu código.

JSON para TypeScript / Go / Rust

Saída

A saída aparece aqui enquanto você digita.

O que esse conversor faz

Ele percorre uma amostra JSON, infere um tipo para cada valor e emite uma definição de tipo idiomática na sua linguagem escolhida. Objetos viram interfaces (TypeScript), structs (Go, Rust), e objetos aninhados produzem definições de tipo irmãs. Arrays de objetos unificam o shape do elemento — campos presentes em alguns itens mas não em outros viram opcionais, e valores primitivos que variam (string em alguns itens, integer em outros) colapsam em union ou em serde_json::Value no Rust. Nenhum dado é enviado a lugar nenhum — todo o inferrer roda no seu navegador.

Como usar

Cole um payload JSON representativo (idealmente um registro da resposta da sua API), escolha a linguagem de destino e copie o resultado. Se seu JSON tem múltiplas instâncias do mesmo shape (uma lista paginada, por exemplo), inclua o array — o inferrer aprende mais com a variação. O toggle de casing renomeia os campos na saída sem mexer nas chaves do JSON; em Go e Rust a chave original é preservada como tag de struct, então a serialização faz round-trip.

Dicas e pegadinhas

  • Opcional vs nullable: um campo faltando em alguns registros vira ? / Option<T>, mas um campo presente em todo lugar com valor literal null vira union com null — os dois são diferentes e inferidos separadamente.
  • Números: integers ficam integers em Go e Rust (int64, i64); floats viram float64 / f64. TypeScript colapsa ambos em number porque a linguagem não distingue.
  • Arrays vazios: [] infere como unknown[] / []interface{} / Vec<serde_json::Value> — coloque um item de exemplo para conseguir um tipo real.
  • Renomeio de campo: só o inferrer renomeia. Seu parser JSON ainda precisa mapear chaves — Go usa tag json:, Rust usa #[serde(rename = ...)].

Perguntas frequentes

Como ele lida com arrays de tipos mistos?
Ele unifica os shapes de elemento. Se um array contém [1, 2, "x"], o tipo do elemento vira number | string. Se contém [{a: 1}, {a: 1, b: 2}], o elemento vira um tipo objeto com a obrigatório e b opcional. Em Go e Rust onde unions não têm equivalente limpo, primitivos mistos colapsam em interface{} / serde_json::Value.
Lida com estruturas profundamente aninhadas?
Sim — não há limite de profundidade. Cada objeto aninhado é nomeado pela chave pai (capitalizada, singularizada quando o pai é plural), e uma tabela interna evita colisão de nomes anexando sufixo numérico. Estruturas autorreferenciais como árvores não são auto-detectadas; talvez você precise mesclar dois tipos gerados na mão se seus dados formam um ciclo.
Por que meus nomes de campo Go ficam em PascalCase mesmo escolhendo preservar?
Go exige que campos exportados de struct comecem com letra maiúscula — é regra da linguagem, não opção de estilo. Nomes em minúscula seriam privados e invisíveis para encoding/json. A chave original do JSON é preservada na tag json:, então a serialização ainda produz o casing de entrada.
Qual a diferença para geradores de código mais pesados?
Geradores corporativos suportam dezenas de linguagens-alvo, entrada por JSON Schema, unions discriminadas, enums nomeados e refinamento em vários passes — útil quando você tem um schema formal e um time grande. Esta ferramenta é um inferrer leve, sem cerimônia, com saída em TypeScript, Go e Rust e zero configuração. Para fluxos one-shot de "me dá um tipo pra essa resposta de API", aqui é mais rápido e a saída é mais fácil de ler e editar à mão.
Minha saída vai compilar?
Quase sempre sim para TypeScript. Saída Go e Rust também é compilável como está, mas pode ser preciso adicionar os imports certos (use serde::{Deserialize, Serialize}; para Rust já vem incluído; encoding/json em Go é implícito). Se chaves do seu JSON colidem com palavras reservadas após o renomeio, Rust usa identificadores raw r# automaticamente.
Algo é enviado para um servidor?
Não. O parser é o JSON.parse do navegador e o inferrer é uma função recursiva pequena nesta página. Abra DevTools > Network e você não verá nenhuma requisição enquanto digita. Seguro para payloads de produção, respostas de API internas e tudo que você não colaria num SaaS hospedado.