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.
Converter JSON em structs de Go
Receber a resposta de uma API em Go obriga a escrever um struct correspondente ao JSON, junto com suas tags json. Com um punhado de campos não custa nada, mas **assim que o aninhamento se aprofunda, percorrer a hierarquia inventando nomes de tipo vira o trabalho em si.** Esta ferramenta gera o conjunto completo de definições, estruturas aninhadas inclusive, a partir apenas do JSON que você colar.
**Convém ter em mente, porém, que o que sai é um tipo deduzido de uma única amostra.** As chaves que não apareceram nela faltarão, naturalmente, e qualquer campo cujo valor fosse `null` passa a ser `interface{}`, já que Go não tem um primitivo anulável a que mapeá-lo. Quando todos os elementos de um arranjo são objetos, as chaves se fundem num único struct e **as presentes em apenas alguns elementos ficam marcadas com `omitempty`.** Transformar a saída num struct de produção pressupõe que você confrontará essas deduções com a especificação real da API e as corrigirá.
Como converter
- Cole o JSON Serve tanto um objeto quanto um arranjo; a resposta de uma API entra como chegou.
- Nomeie o tipo raiz Começa como `Root`. **Os nomes dos tipos aninhados saem sozinhos, convertendo cada nome de propriedade para a notação Pascal.**
- Revise os structs gerados As definições aparecem em ordem hierárquica com suas tags json já postas.
- Copie e dê acabamento Passe o resultado pelo `gofmt` e volte ao que ficou como `interface{}` ou ao que deveria ser ponteiro, seguindo a especificação real.
Dicas para aproveitar melhor
- 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.
Quando é útil
Ao começar um cliente de API
Colar a resposta de exemplo da documentação dá na hora um primeiro rascunho do struct receptor.
Ao carregar um arquivo de configuração
Quando os ajustes ficam em JSON, a estrutura pode ser transcrita diretamente para um tipo.
Ao decifrar a especificação de terceiros
**Um JSON profundamente aninhado fica bem mais claro depois de aberto como um conjunto de structs.**
Ao preparar dados de teste
Deduzir primeiro os tipos de uma resposta real reduz o risco de descompasso na hora de escrever simulações.
Termos do mapeamento de tipos em Go
- Struct
- O tipo de Go que agrupa vários campos. Corresponde a um objeto do JSON.
- Tag json
- A anotação escrita após um campo na forma `json:"user_id"`, que **diz ao codificador como o nome do campo em Go se alinha com a chave do JSON.**
- Omitempty
- Opção da tag json que **deixa o campo fora da saída quando seu valor é o valor zero.** Não significa que o campo aceite nulos, distinção que vale reter.
- Interface{}
- Tipo que aceita qualquer valor. Os nulos do JSON e os campos de tipo variável aterrissam aqui, o que **o torna um bom sinal dos pontos a revisar depois da geração.**
- Notação Pascal
- A convenção de pôr cada palavra em maiúscula, como em `UserId`. Em Go **essa maiúscula inicial carrega ainda o sentido de ser exportada para fora do pacote.**
- Tipo ponteiro
- Um tipo escrito como `*string`. É a que se usa quando a ausência de valor precisa ser distinguida de uma cadeia vazia.
Perguntas frequentes
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.