MiServe DevTools

Os seus autocolantes

Fixe aqui as ferramentas. Ficam guardadas neste navegador.

Conversor de JSON para struct Go e TypeScript

Transforme uma amostra de JSON em structs Go, interfaces ou tipos TypeScript, ou num JSON Schema, com deteção de chaves opcionais, null e datas.

Funciona no seu navegador. Nada do que cola é enviado.

Sobre esta ferramenta

O que é inferido da amostra

A ferramenta percorre o valor JSON e regista o que encontra em cada posição. Os elementos de um array são fundidos numa só descrição: uma chave que falta em alguns dos objetos torna-se opcional, um valor que às vezes é null torna-se anulável, e um array com valores de tipos diferentes torna-se uma união em TypeScript e []any em Go.

Um número só é inteiro se todas as suas amostras estiverem escritas sem ponto decimal nem expoente e couberem num inteiro de 64 bits com sinal; caso contrário, é um número de vírgula flutuante. Uma string só passa a data-hora se todas as amostras forem datas-hora RFC 3339, como 2026-11-14T10:00:00Z. Uma data sem hora continua a ser uma string.

Cada objeto aninhado recebe um tipo com o nome da sua chave. Para os elementos de um array, o nome passa ao singular quando a chave é um plural simples em inglês, por isso users dá User e categories dá Category; caso contrário, é acrescentado Item. Com Embutir tipos aninhados, os objetos aninhados são escritos dentro do respetivo pai.

A saída em Go

Os nomes dos campos são exportados e seguem a convenção do Go para siglas, por isso user_id passa a UserID e html_url passa a HTMLURL, enquanto a tag json mantém a chave original. Os inteiros são int, ou int64 quando uma amostra não cabe em 32 bits, porque a especificação do Go permite que um int tenha 32 bits. Os outros números são float64 e as datas-hora são time.Time. A distinção entre 1 e 1.0 importa: o encoding/json recusa-se a descodificar 1.0 para um campo int.

Com Adicionar omitempty aos campos opcionais ativado, uma chave que falta em algumas amostras recebe omitempty na tag e mantém o seu tipo simples. Um escalar ou uma struct que pode ser null passa a ponteiro, como *string, para que null e o valor zero continuem distintos; um slice ou um map não precisa de ponteiro, porque pode ser nil. Um valor que é sempre null passa a any. As structs aninhadas opcionais e os campos time.Time opcionais também passam a ponteiros, porque omitempty nunca omite um valor de struct. As colunas ficam alinhadas como o gofmt as alinha.

Algumas chaves não podem ser associadas a um campo de struct. Nenhuma tag json pode indicar uma chave vazia ou uma chave que contenha uma vírgula, aspas ou uma barra invertida. O encoding/json original também ignora um nome de tag que contenha algo além de letras, algarismos e pontuação comum, por isso uma chave com um diacrítico combinatório ou um emoji só é reconhecida pela implementação baseada no encoding/json/v2. Quando a amostra tem chaves destas, a ferramenta lista-as por baixo da saída.

A saída em TypeScript e JSON Schema

Em TypeScript, uma chave opcional escreve-se com ?:, um valor anulável com | null, e uma chave que não seja um identificador válido fica entre aspas. As datas-hora são tipadas como string, pois é isso que o JSON.parse devolve, com um comentário que as assinala. A forma interface e a forma alias de tipo descrevem a mesma estrutura; escolha a que o seu código usa.

A saída JSON Schema segue o draft 2020-12. As chaves presentes em todas as amostras ficam listadas em required, os inteiros são integer, as datas-hora têm format: date-time, e os tipos de objeto com nome ficam em $defs e são referenciados com $ref.

Uma amostra mostra como era um documento, não tudo o que uma API pode enviar. Confirme os campos opcionais e anuláveis na documentação da API antes de confiar no resultado.

Perguntas

Como é que a ferramenta sabe que um campo é opcional?

Só o consegue saber a partir de arrays. Quando os objetos de um array não têm todos as mesmas chaves, uma chave que falta em pelo menos um deles é opcional. Um objeto isolado não dá essa informação, por isso todas as suas chaves são tratadas como obrigatórias.

Porque é que um número é int e outro é float64?

Um número é tipado como inteiro quando todas as suas amostras estão escritas sem ponto decimal nem expoente e cabem num inteiro de 64 bits. Em Go, isso é int, ou int64 quando uma amostra está fora do intervalo de 32 bits. Se uma única amostra for 2.5, ou estiver escrita como 1.0, o campo passa a float64 em Go e a number em JSON Schema. O TypeScript usa number para todos.

O que acontece quando um valor é null?

Se o mesmo campo tiver também uma amostra não nula, o tipo passa a anulável: em Go, um ponteiro, ou um slice ou map, que já podem ser nil; em TypeScript, uma união com null; em JSON Schema, um schema que também aceita null. Se null for a única amostra, nada se sabe sobre o tipo real, por isso o resultado é any em Go e null em TypeScript e JSON Schema.

O meu JSON é enviado para um servidor?

Não. Os tipos são gerados por JavaScript no separador do seu navegador. A ferramenta não faz nenhum pedido de rede com o que cola, e a política de segurança do site bloqueia pedidos a qualquer outro servidor.

Mais ferramentas de Dados