Como gerar tipos e classes a partir de JSON

O jeito mais rápido de ter os tipos de modelo de uma API é gerá-los a partir de uma resposta real: cole o JSON, escolha a linguagem e copie o código. Um gerador lê cada valor, decide se é texto, número inteiro, decimal ou data, e transforma objetos aninhados em tipos próprios. Este guia explica o que um gerador consegue e não consegue saber a partir de um exemplo, e o que conferir antes de o código entrar no seu projeto.

4 min de leitura

Por que gerar tipos

Modelos tipados pegam erros cedo. Quando a resposta de uma API é descrita por uma interface ou uma classe, o editor completa os nomes dos campos, o compilador percebe uma chave escrita errada e um campo renomeado aparece como erro, em vez de um undefined ou null silencioso em tempo de execução. Escrever esses tipos à mão para uma resposta com cinquenta campos e três níveis de aninhamento leva tempo e é fácil de errar.

Um gerador faz a parte repetitiva em um segundo. O resultado é um bom primeiro rascunho, que você depois revisa, renomeia onde precisar e faz o commit.

Experimente aqui: JSON para código

Abrir a página completa da ferramenta

O que um gerador deduz do seu exemplo

Tudo vem dos valores do seu JSON. Por isso a qualidade do exemplo importa mais que qualquer outra coisa.

No JSONDeduzido comoExemplo
Textostring"nome": "Ana"
Número inteiroint, ou long acima de 2.147.483.647"id": 42
Número com ponto decimaldouble ou float"preco": 19.0
true ou falseboolean"ativo": true
Texto no formato de data ISOtipo de data, se ativado"criado": "2026-10-27T09:30:00Z"
null em alguns itenstipo anulável"telefone": null
Chave ausente em alguns itenscampo opcional"desconto" só em um item
Objetoum novo tipo com nome"endereco": { ... }
Lista de objetoslista de um tipo combinado"itens": [ { ... }, { ... } ]

Use um exemplo com variedade

Um gerador só consegue descrever o que vê. Se o seu exemplo tem um pedido com um item, todos os campos parecem obrigatórios e nenhum parece anulável. Se tem uma lista de pedidos em que alguns têm desconto e outros não, o campo de desconto é marcado corretamente como opcional.

Então, antes de gerar, junte uma resposta com vários itens, de preferência incluindo casos extremos: um cliente sem telefone, um pedido sem itens, um produto com preço decimal. Coloque todos numa lista no nível principal e o gerador combina todos eles num tipo para cada formato.

  • Campos que são null em todos os itens recebem um tipo genérico como unknown, object ou Any, porque o tipo real não aparece.
  • Listas vazias viram listas de itens desconhecidos pelo mesmo motivo.
  • Um campo que é número num item e texto em outro vira uma union no TypeScript e um tipo genérico nas outras linguagens.
  • IDs grandes acima de 2^53, como algumas chaves de banco de dados, ficam mais seguros como texto. O JavaScript não consegue representá-los exatamente como números.

Nomes, atributos e convenções

As chaves do JSON costumam seguir o estilo do backend, por exemplo snake_case vindo de Python ou Ruby, enquanto o código do cliente usa outro. Um bom gerador renomeia os campos para a convenção da linguagem de destino e guarda a chave original num atributo, para que a serialização continue batendo com os dados.

LinguagemNomes dos camposComo a chave do JSON é mantida
TypeScriptSem mudançaNão precisa; chaves incomuns ficam entre aspas
C#PascalCase[JsonPropertyName] ou [JsonProperty]
Pythonsnake_caseField(alias=...) no Pydantic
GoExportados, com ID e URLstruct tags json:"chave"
JavacamelCase@JsonProperty (Jackson)
KotlincamelCase@SerialName (kotlinx.serialization)

Tipos não são validação

Uma interface TypeScript desaparece quando o código é compilado. Se a API mandar algo diferente do que a interface promete, nada impede isso em tempo de execução. O mesmo vale para classes simples na maioria das linguagens: o desserializador preenche o que consegue e deixa o resto vazio.

Se os dados vêm de fora do seu controle, valide quando eles chegam. No Python, os modelos Pydantic fazem isso direto, o que é um bom motivo para escolher esse estilo no gerador. No TypeScript, dá para escrever, a partir das interfaces geradas, validações com bibliotecas que conferem os dados em tempo de execução. Em C#, Java e Kotlin, marque como obrigatórios os campos que precisam estar presentes e deixe o serializador falhar cedo.

Checklist antes do commit

  • Renomeie o tipo principal de Root para algo com sentido, como Pedido.
  • Revise cada campo tipado como unknown, object, Any ou JsonElement e troque pelo tipo real.
  • Confira os números: um preço é mesmo double, ou deveria ser um tipo decimal para dinheiro?
  • Confira as datas: você quer como texto, ou como tipo de data com fuso horário conhecido?
  • Decida quais campos opcionais são opcionais de verdade e quais só estavam faltando no exemplo.
  • Junte tipos que o gerador separou só porque os exemplos eram um pouco diferentes.

Passo a passo

  1. Cole uma resposta JSONCole a resposta da sua API ou abra um arquivo .json. Uma lista com vários itens dá resultados melhores.
  2. Escolha a linguagemEscolha TypeScript, C#, Python, Go, Java ou Kotlin e depois o estilo, como record, dataclass ou Pydantic.
  3. Dê nome ao tipo principalTroque Root em Nome do tipo principal pelo nome que o seu projeto usa, por exemplo Pedido.
  4. Copie e reviseCopie ou baixe o código e depois passe pelo checklist deste guia.

Perguntas frequentes

Posso gerar tipos a partir de um JSON Schema?

Esta ferramenta trabalha com dados JSON, não com um schema. Se a sua API publica um JSON Schema ou um arquivo OpenAPI, um gerador baseado em schema dá resultados mais precisos, porque o schema diz o que é obrigatório.

Por que um campo ficou opcional na minha interface TypeScript?

Pelo menos um item do seu exemplo não tinha essa chave. Se ela sempre aparece nos dados reais, tire o ponto de interrogação ou acrescente um item completo ao exemplo.

Dinheiro deve ser double?

Para cálculos com dinheiro, um tipo decimal como decimal no C# ou BigDecimal no Java evita erros de arredondamento. Um gerador só vê um número com ponto decimal, então mude o tipo você mesmo.

O que acontece com chaves com espaços ou hífens?

Elas são convertidas em nomes válidos em cada linguagem, e a chave original fica guardada num atributo, tag ou alias. No TypeScript a chave só fica entre aspas.

Meu JSON é enviado quando gero código aqui?

Não. O gerador roda no seu navegador, então respostas com dados privados ficam no seu dispositivo.