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 Produto com tags JSON nos campos.
  • Criar uma instância de Produto com valores.
  • Usar json.Marshal e 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

  1. Declaramos Produto com dois campos. Cada campo tem uma tag entre crases: `json:"nome"` e `json:"preco"`.
  2. No main, criamos p com Produto{Nome: "Caneta", Preco: 2.5}.
  3. json.Marshal(p) percorre os campos e usa as tags para nomear as chaves JSON. Sem tags, as chaves seriam Nome e Preco (com maiúsculas).
  4. Verificamos o erro retornado por Marshal. Em caso de sucesso, convertemos []byte para string e imprimimos.
  5. 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 usamos if 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}