JSON para tipos
Uma amostra de um lado, um tipo do outro.
Os exemplos substituem temporariamente os dados e as configurações. Você pode restaurar seu trabalho anterior.
Cole ou digite acima para ver o resultado aqui.
Seus arquivos ficam no seu dispositivo
Esta ferramenta roda inteiramente no seu navegador. O que você cola é processado no seu dispositivo e nunca é enviado a um servidor, então é seguro usar com tokens, chaves e textos não publicados.
Exemplo
Exemplo: dois pedidos de loja virtual em esquema Zod, com parcelas só no cartão
Uma loja virtual quer validar os pedidos que chegam do checkout antes de emitir a nota. Cola dois pedidos como array JSON: 5501, Ana Souza, CEP 01310-100 em São Paulo, R$ 189,90 no Pix; e 5502, Carlos Lima, CEP 30130-010 em Belo Horizonte, R$ 459,00 no cartão em 3 parcelas. Configuração: Zod, nome Pedido, recuo de 2 espaços.
- Como o JSON começa com um array, o esquema descreve um pedido e se chama Pedido. cliente, endereco e pagamento viram esquemas próprios (Cliente, Endereco, Pagamento), declarados antes de Pedido.
- parcelas só existe no pedido no cartão, então sai z.number().optional(): um pedido no Pix sem parcelas continua válido.
- cep e cpf estão entre aspas no JSON e ficam z.string(); assim o hífen do CEP e um zero à esquerda não se perdem.
- valor_total 189.9 e 459 viram z.number(). No JSON o decimal é com ponto: 189,90 com vírgula não seria JSON válido.
| Campo | Nos dois pedidos | Esquema |
|---|---|---|
| id | 5501, 5502 | z.number() |
| cliente | nome e cpf | Cliente |
| endereco.cep | "01310-100", "30130-010" | z.string() |
| valor_total | 189.9, 459 | z.number() |
| pagamento.forma | "pix", "cartao" | z.string() |
| pagamento.parcelas | só no 5502: 3 | z.number().optional() |
4 esquemas (Pagamento, Endereco, Cliente e Pedido) e o tipo Pedido via z.infer. Para validar a lista inteira, use z.array(Pedido). Vale apertar à mão: forma pode virar um z.enum com pix, cartao e boleto, e uf ter sempre 2 letras; uma amostra não mostra isso.
Como funciona
- Cole uma resposta real. Um registro de verdade vale mais do que um inventado.
- Escolha TypeScript, Go ou Zod.
- Dê nome ao tipo principal ou deixe Root.
- Copie o resultado e leia: inferir de uma amostra dá um primeiro rascunho, não uma especificação.
Perguntas frequentes
- Ele olha todos os elementos do array ou só o primeiro?
- Todos. [{a:1},{a:1,b:2}] deixa b opcional em vez de fingir que não existe — exatamente o erro que torna tipos gerados chatos duas semanas depois.
- O que ele faz com null?
- Alarga em vez de estreitar. Um campo que já foi null é um campo que pode ser null: em TypeScript vira união, em Go vira ponteiro. É quase sempre o que a API realmente faz.
- Dá para confiar no resultado?
- Como ponto de partida. Uma amostra não diz que um campo é um enum, que um número é inteiro ou que um texto é uma data: leia e aperte. Poupa a digitação, não o raciocínio.
- Como tiro o tipo TypeScript do esquema Zod?
- Já vem pronto: a última linha declara um tipo com o mesmo nome do esquema principal, feito com z.infer, então o mesmo nome serve para validar com .parse() e para tipar. Os esquemas internos vêm antes porque, no Zod, um esquema precisa ser declarado antes de ser usado.
- E se o meu JSON começar com um array?
- O tipo descreve um elemento só, com o nome que você digitar, e todos os elementos são lidos: um campo que falta em alguns sai opcional. No TypeScript, uma última linha acrescenta o tipo da lista, como PedidoList = Pedido[]; no Zod, valide a lista com z.array() em volta do esquema.
- Alguma coisa é enviada para um servidor?
- Não. Roda no navegador, então o que você colar fica no seu computador.