Como ocultar campos de struct em JSON: Go para iniciantes e profissionais

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

A mágica do JSON em Go: por que alguns campos são visíveis e outros não?

\n

Você já se deparou com uma situação em que sua struct Go envia na resposta JSON algo que o cliente não precisa ver? Por exemplo, a senha de um usuário, o ID interno do banco de dados ou uma chave secreta. Ou, ao contrário, precisa mostrar um campo apenas sob uma condição específica (por exemplo, se não estiver vazio).

\n

Esse problema é um dos mais populares no Stack Overflow, e não é à toa. Trabalhar com JSON em Go é uma arte de equilíbrio entre o rigor dos tipos e a flexibilidade da representação. Hoje vamos abordar todas as formas: desde a tag simples json:"-" até soluções personalizadas complexas com interfaces. Vamos nessa!

\n\n

1. A maneira mais simples: a tag json:"-"

\n

Go permite controlar a serialização de uma struct por meio de tags especiais. Se você quiser ocultar permanentemente um campo do JSON, basta adicionar json:"-".

\n
type User struct {\n    Name     string `json:"name"`\n    Password string `json:"-"`\n    Age      int    `json:"age"`\n}\n\nfunc main() {\n    u := User{Name: "Alice", Password: "supersecret", Age: 30}\n    data, _ := json.Marshal(u)\n    fmt.Println(string(data))\n    // Saída: {"name":"Alice","age":30}\n}
\n

O campo Password desapareceu, como se nunca tivesse existido. Ideal para dados confidenciais que nunca devem sair do servidor.

\n\n

2. Ocultação condicional: omitempty

\n

Às vezes, é necessário ocultar um campo apenas se ele estiver vazio. Para isso, usa-se a opção omitempty (abreviação de "omit if empty").

\n
type Product struct {\n    Name        string  `json:"name"`\n    Description string  `json:"description,omitempty"`\n    Price       float64 `json:"price,omitempty"`\n}\n\nfunc main() {\n    p1 := Product{Name: "Livro", Price: 500.0}\n    data1, _ := json.Marshal(p1)\n    fmt.Println(string(data1)) // {"name":"Livro","price":500}\n\n    p2 := Product{Name: "Curso"}\n    data2, _ := json.Marshal(p2)\n    fmt.Println(string(data2)) // {"name":"Curso"}\n}
\n

Importante: omitempty funciona apenas com valores "zero": "", 0, false, nil (para slices, maps, ponteiros).

\n\n

Armadilha com campos numéricos

\n

Cuidado: se Price for igual a 0, ele também será ocultado. Em algumas lógicas de negócio, isso é inaceitável (um produto gratuito também é um preço). Nesses casos, é melhor usar ponteiros.

\n\n

3. Uso de ponteiros (*) e interfaces

\n

Ponteiros são seus melhores amigos quando você precisa distinguir entre "valor não informado" e "valor igual a zero".

\n
type UserProfile struct {\n    Name    string  `json:"name"`\n    Age     *int    `json:"age,omitempty"`  // ponteiro para int\n    Bio     *string `json:"bio,omitempty"`\n}\n\nfunc main() {\n    // Idade não informada — campo será ocultado\n    u1 := UserProfile{Name: "João"}\n    data1, _ := json.Marshal(u1)\n    fmt.Println(string(data1)) // {"name":"João"}\n\n    // Idade = 0 — é um valor significativo\n    zero := 0\n    u2 := UserProfile{Name: "Maria", Age: &zero}\n    data2, _ := json.Marshal(u2)\n    fmt.Println(string(data2)) // {"name":"Maria","age":0}\n}
\n

Essa abordagem é frequentemente usada em APIs REST, onde é necessário atualizar apenas os campos enviados (atualização parcial, requisições PATCH).

\n\n

4. Serialização personalizada: interface json.Marshaler

\n

Se as tags padrão não forem suficientes, você pode controlar totalmente o processo. Implemente a interface json.Marshaler e escreva sua própria lógica.

\n
type DynamicUser struct {\n    ID        int\n    Name      string\n    ShowEmail bool\n    Email     string\n}\n\nfunc (u DynamicUser) MarshalJSON() ([]byte, error) {\n    // Criamos uma struct anônima apenas para serialização\n    m := map[string]interface{}{\n        "id":   u.ID,\n        "name": u.Name,\n    }\n    if u.ShowEmail {                

Blogs

Book Recommendations