Geradores de código · 5 min de leitura
JSON to Go: structs que desempacotam na primeira tentativa
Go faz você anotar a forma do JSON que você está decodificando, e o compilador o mantém fiel a ela. Uma conversão JSON to Go de uma resposta real elimina tanto a digitação quanto as suposições: nomes de campos, tags `json` e tipos aninhados chegam corretos, e você pode ir direto para a parte do programa que realmente faz alguma coisa.
Atualizado
A forma gerada
Um conversor transforma cada objeto JSON em uma estrutura, cada array em uma fatia e infere um tipo Go por valor. Objetos aninhados tornam-se tipos nomeados em vez de blobs anônimos, o que mantém legível a assinatura do seu código de decodificação:
type Container struct {
Name string `json:"name"`
Image string `json:"image"`
Ports []struct {
ContainerPort int `json:"containerPort"`
} `json:"ports"`
}
As tags `json` são a parte importante. O decodificador de Go não diferencia maiúsculas de minúsculas ao combinar nomes de campos, mas `containerPort` e `ContainerPort` não se alinham sem uma tag, e qualquer chave que não seja um identificador Go válido — `app.kubernetes.io/name`, por exemplo — não pode ser correspondida sem uma.
Números, nulos e as duas armadilhas clássicas
- Números — a inferência produz `int` para valores inteiros, mas JSON não tem tipo inteiro. Um campo que é `3` hoje pode ser `3.5` amanhã, então IDs e dinheiro são mais seguros como `float64`, `string` ou `json.Number` dependendo de suas necessidades.
- Nulos — uma chave que pode ser `null` deve ser um ponteiro (`*string`) para que você possa diferenciar “ausente” de “vazio”.
- Timestamps — uma string RFC 3339 é decodificada corretamente em `time.Time`; um número de época Unix não, então mantenha-os como `int64` e converta explicitamente.
- Campos desconhecidos — `json.Decoder` ignora extras por padrão; use `DisallowUnknownFields` quando preferir falhar ruidosamente.
Gere a partir de duas ou três respostas quando puder. Os campos que às vezes faltam tornam-se ponteiros, e essa decisão é muito mais fácil de tomar a partir de evidências do que de memória.
Da estrutura ao código de trabalho
Com as estruturas instaladas, a decodificação é de três linhas e o compilador impõe os caminhos de acesso a partir daí. Um padrão comum é decodificar na estrutura gerada e, em seguida, mapear em seu tipo de domínio para que a forma JSON possa mudar sem se propagar pelo aplicativo. Marque o arquivo gerado com o endpoint de onde ele veio e regenere quando a resposta mudar, em vez de editá-lo manualmente - o código gerado editado manualmente é a versão que ninguém se atreve a gerar novamente mais tarde.
Gerar localmente
As cargas úteis a partir das quais vale a pena gerar estruturas Go geralmente são respostas API reais, e as respostas reais carregam tokens e dados do cliente. Uma conversão JSON to Go baseada em navegador mantém a carga útil na guia — sem upload, sem questão de retenção — o que torna a geração de dados de produção uma etapa normal, em vez de uma exceção de política.
JSON para ir — perguntas frequentes
Por que minhas estruturas Go não estão decodificando JSON?
Os nomes dos campos em JSON raramente correspondem exatamente aos nomes exportados do Go, então a estrutura precisa de tags `json`. Gere novamente com tags habilitadas, confirme a ortografia da chave, incluindo pontuação, e verifique se o decodificador deve permitir campos desconhecidos.
Os campos numéricos gerados devem ser int ou float64?
Use `float64` — ou `json.Number` quando a precisão é importante — para qualquer coisa a partir de um API externo, porque JSON não distingue números inteiros de decimais. Reserve `int` para valores que você controla de ponta a ponta.
Como lidar com um campo que às vezes é nulo?
Torne-o um tipo de ponteiro como `*string`, que codifica tanto “chave ausente” quanto “chave presente com valor nulo”, ao mesmo tempo que permite verificar um valor real. Os campos que não são ponteiros tornam-se silenciosamente valores zero.
Ferramentas mencionadas nesta postagem
Mais artigos para ler
6 min de leitura
JSON a TypeScript: tipos que correspondem à realidade
Converta interfaces JSON em TypeScript a partir de uma resposta API real — chaves opcionais, uniões nulas, tipos aninhados — e evite que os tipos gerados se desloquem.
5 min de leitura
JSON a SQL: de um payload para uma tabela que você pode
Converta JSON em SQL com instruções CREATE TABLE e INSERT geradas a partir de uma carga útil real, com mapeamento de tipo sensato, escape e limites honestos.
6 min de leitura
Formatador JSON: bonito, reduzido e realmente válido
Um formatador JSON que imprime, minimiza e valida com localizações exatas de erros — além dos cinco erros de sintaxe por trás de quase todos os erros JSON inválidos.
- Artigo mais longo para ler: JSON a TypeScript: tipos que dizem a verdade