Médio Go
Struct com tags e JSON
Enunciado
Crie uma struct Produto com campos Nome (string) e Preco (float64), ambos com tags JSON (json:"nome" e json:"preco"). Crie um produto, converta para JSON com json.Marshal e imprima a string resultante.
Requisitos
- Declarar a struct
Produtocom tags JSON nos campos. - Criar uma instância de
Produtocom valores. - Usar
json.Marshale imprimir o JSON gerado.
Código inicial
package main
import (
"encoding/json"
"fmt"
)
// Defina a struct Produto com tags
func main() {
// Crie um produto, converta para JSON e imprima
}
Saída esperada
{"nome":"Caneta","preco":2.5}
Ver dica
As tags ficam entre crases após o tipo do campo: Nome string json:"nome"``. Use json.Marshal e converta o resultado para string com string(b).
Mostrar solução
package main
import (
"encoding/json"
"fmt"
)
// Produto com tags JSON para mapear os nomes dos campos.
type Produto struct {
Nome string `json:"nome"`
Preco float64 `json:"preco"`
}
func main() {
p := Produto{Nome: "Caneta", Preco: 2.5}
// Marshal converte a struct em JSON usando as tags.
b, err := json.Marshal(p)
if err != nil {
fmt.Println("erro:", err)
return
}
fmt.Println(string(b))
}
Passo a passo
- Declaramos
Produtocom dois campos. Cada campo tem uma tag entre crases:`json:"nome"`e`json:"preco"`. - No
main, criamospcomProduto{Nome: "Caneta", Preco: 2.5}. json.Marshal(p)percorre os campos e usa as tags para nomear as chaves JSON. Sem tags, as chaves seriamNomeePreco(com maiúsculas).- Verificamos o erro retornado por
Marshal. Em caso de sucesso, convertemos[]byteparastringe imprimimos. - A saída é
{"nome":"Caneta","preco":2.5}.
Por que funciona
Tags são metadados lidos por reflexão. O pacote encoding/json interpreta a tag json para decidir o nome da chave. Como os campos são exportados (começam com maiúscula), eles são incluídos no JSON; campos não exportados seriam ignorados.
Erros comuns
- Esquecer as crases:
json:"nome"sem crases não é uma tag válida e o campo usaria o nome original. - Usar campos não exportados:
nome string(minúsculo) não aparece no JSON. - Ignorar o erro de
Marshal: embora raro, é boa prática verificar. Aqui usamosif err != nil.
Outra forma de resolver
Você pode usar json.MarshalIndent para gerar JSON formatado:
b, _ := json.MarshalIndent(p, "", " ")
fmt.Println(string(b))
Útil para depuração, mas a saída não seria idêntica à esperada.
Saída esperada
{"nome":"Caneta","preco":2.5}