YamlBox

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

Navegue pela lista completa de 19 ferramentas

Mais artigos para ler

Todas as 19 postagens →