Conversor de JSON para Struct Go

Cole um objeto JSON (ou um array JSON) para gerar automaticamente as definições de struct Go correspondentes com tags json.

Dicas de uso

  • Quando todos os elementos de um array são objetos, suas chaves são mescladas em um único struct. Chaves ausentes em alguns elementos recebem automaticamente a tag json `omitempty`.
  • O nome do tipo raiz é "Root" por padrão, mas você pode renomeá-lo como quiser. Os nomes de struct para objetos aninhados são gerados automaticamente convertendo o nome da propriedade para PascalCase.
  • O valor null do JSON é gerado como `interface{}`, já que Go não tem um tipo primitivo nativo que aceite null. Considere usar um ponteiro se precisar de um tratamento mais rigoroso.
  • O resultado é um rascunho com colunas levemente alinhadas. Passá-lo pelo `gofmt` após colar vai ajustá-lo ao estilo padrão do seu projeto.
  • Cole uma resposta JSON de exemplo da sua API como está para obter rapidamente um rascunho do struct de resposta usado no seu código Go.

Perguntas frequentes

Escrever um struct manualmente a partir de uma resposta de exemplo demora e é propenso a erros: é fácil errar a conversão de um nome de campo ou esquecer uma tag json, especialmente com objetos muito aninhados. Gerar automaticamente economiza bastante tempo de implementação e evita esses erros.

As chaves JSON (em snake_case ou camelCase) são convertidas para PascalCase, com a primeira letra maiúscula, gerando nomes de campo exportáveis em Go. A chave JSON original é mantida tal como está na tag json (`json:"chave_original"`), então a codificação e decodificação continuam funcionando corretamente.

Um valor null é gerado como o tipo `interface{}`. Uma chave presente apenas em alguns elementos de um array recebe automaticamente a tag json `omitempty`, mas o próprio tipo Go só assume seu valor zero, então considere usar um ponteiro se precisar distinguir "ausente" de "zero".

Um número JSON com ponto decimal é classificado como `float64`, e um sem ponto decimal como `int`. Como a notação numérica do JSON só preserva os dígitos, ajuste manualmente o tipo depois para valores grandes o bastante para precisarem de `int64`.

Como Go não tem tipos união, uma chave cujo tipo varia entre elementos cai de volta para `interface{}`. Você precisará usar uma asserção de tipo em tempo de execução para determinar o tipo real do valor.
ツールくん

Curiosidade — Por que Go combina structs com tags json

Go é uma linguagem de tipagem estática, e ao trabalhar com JSON, o pacote `encoding/json` da biblioteca padrão depende da correspondência entre os campos do struct e suas tags json para codificar e decodificar dados. Escrever manualmente um struct para o formato de resposta de uma API externa é uma tarefa repetitiva que cresce a cada campo adicionado, e isso se repete em muitos projetos Go.

Esta ferramenta analisa a estrutura de um JSON de exemplo e gera automaticamente as definições de struct e as tags json correspondentes, reduzindo esse trabalho repetitivo. Uma ferramenta conhecida no mesmo espaço é o quicktype, que suporta conversão para tipos de várias linguagens; mas para o caso mais simples de colar uma resposta de API de exemplo e obter rapidamente um struct Go, uma ferramenta focada em uma única tarefa também tem sua conveniência.

Como Go não tem nenhum recurso de linguagem para tornar um campo de struct opcional, a abordagem comum para campos JSON que podem estar ausentes é adicionar `omitempty` à tag json, ou usar um tipo ponteiro (como `*string`) para distinguir um valor zero de "nenhum valor". O struct gerado é apenas uma inferência mecânica a partir da estrutura, então tratar a possibilidade de null e futuras mudanças da API como algo a ser verificado e ajustado manualmente contra a especificação real é a prática padrão.