De JSON para modelos TypeScript, Zod e Pydantic

Gere interfaces TypeScript, esquemas Zod e modelos Pydantic a partir de um exemplo JSON nesta página. A saída é conferida com tsc --strict, Zod 3 e 4 e Pydantic 2 antes de publicar.

Funciona localmente no seu navegador
Sample JSON

Cole uma resposta de API, fixture ou objeto de configuração. A amostra permanece neste navegador.

Generated code
Generate from a JSON sample to create TypeScript types.

A inferência usa a amostra fornecida. Revise IDs, valores nullable, strings de data e restrições de negócio antes de usar os tipos gerados em produção.

Como gerar as três saídas

Cole um exemplo JSON, dê um nome ao tipo raiz e clique em Gerar tipos: a mesma estrutura aparece em TypeScript, Zod e Pydantic, cada uma em sua aba. O exemplo é lido pelo próprio navegador nesta página; nada é enviado e nenhuma requisição o transporta.

Os nomes inferidos são conferidos com compiladores reais antes de publicar: a saída TypeScript passa no tsc --strict, o esquema Zod valida o próprio exemplo no Zod 3 e no Zod 4, e os modelos Pydantic importam e validam o exemplo no Pydantic 2.

  1. Cole um exemplo JSON: uma resposta de API, um fixture ou um objeto de configuração.
  2. Defina o nome do tipo raiz; espaços, hifens e sublinhados viram um nome capitalizado.
  3. Clique em Gerar tipos (ou Carregar exemplo para ver um preenchido) e alterne entre as abas TypeScript, Zod e Pydantic.
  4. Clique em Copiar código visível para a aba aberta e revise os campos opcionais e anuláveis antes de confiar neles.

O que o gerador infere e onde ele para

As três saídas

Um objeto JSON vira uma interface (ou um alias de tipo quando o exemplo é um array ou um valor solto), arrays viram Array<…> e um objeto vazio vira Record<string, unknown>. O Zod recebe a mesma estrutura como esquema mais um tipo z.infer, e o Pydantic recebe uma classe BaseModel por objeto com List, Optional, Union e Dict do typing.

A caixa Export declarations decide se as linhas de TypeScript e Zod levam export; a saída do Pydantic é Python comum nos dois casos.

Arrays e campos opcionais

Todas as entradas de um array são fundidas: a chave que aparece só em parte dos objetos fica opcional (role?: string no TypeScript, .optional() no Zod, Optional[…] = None no Pydantic) e a chave com valores de tipos diferentes vira uma união. Objetos misturados com escalares ou com null também geram uma união, e null nunca esconde o outro tipo: ele é mantido ao lado dele.

Um array vazio é unknown / z.unknown() / List[Any], porque uma amostra sem elementos não traz informação de tipo.

Nomes que precisam ser renomeados

Chaves que o Python não aceita mantêm a grafia JSON como alias: {"a-b": 1} vira a_b com alias="a-b", e class, import ou None viram class_, import_ ou None_ para o arquivo importar. Chaves model_config, model_dump e qualquer outra que comece com model_ também ganham sufixo, porque o Pydantic reserva esse espaço de nomes.

Duas chaves que de outra forma se fundiriam em um único campo continuam separadas: {"a-b": 1, "a_b": 2} gera a_b e a_b_2 com seus próprios aliases, e objetos aninhados com nomes em conflito recebem classes distintas.

Limites e privacidade

Tudo roda na aba: a conversão não envia requisição e o exemplo desaparece ao recarregar. Um exemplo de 2 MB é tipado em cerca de 0,35 s no Chrome.

Os tipos vêm de um único exemplo, então descrevem o que aquele documento contém: as chaves opcionais são as que faltam em parte do array, não as que sua API pode omitir, e textos continuam string — nenhum formato de e-mail, data ou UUID é adivinhado. O analisador JSON do navegador lê o exemplo, então inteiros acima de 2^53 perdem precisão e terminam como float na saída do Pydantic.

Ferramentas recentes: