Ir para o conteúdo
Toova
Todas as Ferramentas

JSON para TypeScript, Go, Python, PHP, Rust

Privado por design — roda inteiramente no seu navegador

Inferir os tipos corretos a partir de uma resposta de API real é uma daquelas tarefas que deveria levar cinco segundos mas come quinze minutos. Esta ferramenta lê uma amostra de JSON no seu navegador, percorre a estrutura e emite tipos idiomáticos para TypeScript, Go, Python, PHP ou Rust — com campos opcionais, detecção de datas ISO e distinção correta entre inteiro e float.

Como a inferência funciona

A ferramenta percorre a árvore JSON uma vez, montando uma representação intermediária: primitivos viram string / int / float / bool / null, arrays inferem o tipo do elemento pela união dos seus itens, e objetos produzem um struct onde cada campo herda o tipo do valor. Se um campo aparece em alguns elementos do array mas em outros não, ele é marcado como opcional — o tipo gerado consegue decodificar dados parciais sem quebrar. Números sem parte fracionária saem como int64 (Go) / int (Python) / i64 (Rust), com fracionária como float64 / float / f64. Strings no padrão ISO 8601 (`2024-03-15T10:30:00Z`) viram Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.

Estilo de saída por linguagem

Cada emissor segue a convenção da linguagem alvo. TypeScript: interfaces exportadas com `?:` para opcionais. Go: structs com tags `json:`, opcionais como ponteiro com `omitempty`. Python: `@dataclass` com obrigatórios antes e `Optional[T] = None` no fim (regra de ordenação do dataclass). PHP: classes final com strict types e dicas `@var list<T>` para arrays tipados. Rust: structs com `#[derive(Serialize, Deserialize)]`, `Option<T>` para anuláveis e `#[serde(rename)]` sempre que o nome em snake_case do Rust difere da chave JSON.

Quando usar (e quando não)

O gerador resolve os primeiros 80% do trabalho: chegar a uma definição de tipo funcional a partir de um payload em segundos. Não substitui um schema escrito à mão quando você precisa de restrições precisas (regex em strings, min/max em números, uniões discriminadas). Nesses casos, use a saída como ponto de partida e aperte os tipos. A detecção de opcionais é heurística — baseada no que está presente na amostra — então passe várias amostras diversas se puder.

Perguntas Frequentes

O JSON que eu colo sai do meu navegador?
Não. Parser, inferência e geração rodam em JavaScript dentro da aba. Abra o painel Network enquanto gera — zero requisições saindo. Seguro para payloads de produção com tokens reais e PII.
Por que meu campo está marcado como opcional sendo que sempre tem valor?
A flag de opcional dispara quando um array contém objetos com o campo e outros sem. Se você cola um único objeto, nada vira opcional. Se cola um array de objetos idênticos, idem. A flag só aciona quando a estrutura dentro do array varia.
Como inteiro e float são distinguidos?
JSON tem só um tipo numérico. A ferramenta inspeciona cada valor e emite int quando não tem parte fracionária (`42`, `1000`) e float quando tem (`3.14`, `99.0`). Se um array mistura os dois, o tipo é alargado para float pra evitar decodificação com perda.
Detecta strings de data ISO?
Sim. Strings no padrão `YYYY-MM-DD` ou `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` são emitidas como o tipo nativo de data/hora da linguagem (Date no TS, time.Time no Go, datetime no Python, DateTimeInterface no PHP, chrono::DateTime no Rust). Outros formatos ficam como string — teste colando se tiver dúvida.
Preciso instalar algo para usar o código gerado?
TypeScript: nada, é puro. Go: só biblioteca padrão (time.Time quando há datas ISO). Python: módulo dataclasses padrão. PHP: tipos nativos. Rust: precisa de serde + chrono se houver datas ISO. Os imports/cabeçalho saem na própria saída quando aplicável.
Posso gerar tipos para um array de objetos na raiz?
Sim. Se a raiz é um array de objetos, a ferramenta emite um struct para o elemento e um alias de tipo no topo para o array. Por exemplo, um JSON `[{...}, {...}]` chamado `Users` produz `User` + `type Users = User[];` em TypeScript, ou `pub type Users = Vec<User>;` em Rust.