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.
Fixe aqui as ferramentas. Ficam guardadas neste navegador.
Fixe uma ferramenta e o autocolante dela aparece aqui.
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.
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.
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.
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.
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.
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.
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.
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.
Abre numa janela própria e continua a funcionar offline.
Para instalar, toque no botão Partilhar e depois em «Adicionar ao ecrã principal».