Introdução ao trabalho com JSON em Go
JSON (JavaScript Object Notation) é um formato leve de troca de dados, amplamente utilizado em desenvolvimento web, APIs e arquivos de configuração. A linguagem Go (Golang) fornece o pacote embutido encoding/json, que permite realizar facilmente parsing (decodificação) e serialização (codificação) de dados. Neste artigo, abordaremos os fundamentos do trabalho com JSON em Go com exemplos práticos, compreensíveis até mesmo para desenvolvedores iniciantes.
Fundamentos do pacote encoding/json
O pacote encoding/json é uma biblioteca padrão do Go que não requer instalação adicional. As duas principais ferramentas neste pacote são as funções json.Marshal (serialização) e json.Unmarshal (desserialização).
Estruturas e tags JSON
Em Go, os dados geralmente são representados na forma de estruturas (struct). Para gerenciar os nomes dos campos em JSON, são usadas tags. Vejamos um exemplo simples:
package main
import ( "encoding/json" "fmt")
// Definimos uma estrutura com tags JSONtype Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` IsAdmin bool `json:"is_admin"`}
func main() { // Criamos uma instância da estrutura person := Person{ Name: "João Silva", Age: 30, Email: "joao@example.com", IsAdmin: true, } // Serializamos para JSON jsonData, _ := json.Marshal(person) fmt.Println(string(jsonData))}Resultado da execução:
{"name":"João Silva","age":30,"email":"joao@example.com","is_admin":true}Pontos importantes:
- A tag
json:"name"indica como o campo será nomeado no JSON - A opção
omitemptyomite campos vazios (valores zero) - Os campos da estrutura devem ser exportáveis (começar com letra maiúscula)
Serialização (Marshal) de dados em JSON
Serialização é o processo de converter uma estrutura Go ou outro tipo de dados em uma string JSON. A função json.Marshal retorna um slice de bytes ([]byte) e um erro.
Exemplos de serialização de diferentes tipos
package main
import ( "encoding/json" "fmt")
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Tags []string `json:"tags,omitempty"` InStock bool `json:"in_stock"`}
func main() { // Serialização de uma estrutura product := Product{ ID: 101, Name: "Notebook", Price: 79999.99, Tags: []string{"eletrônicos", "notebooks"}, InStock: true, } // Saída formatada com indentação jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // Serialização de um slice de estruturas products := []Product{ {ID: 1, Name: "Mouse", Price: 1500.00, InStock: true}, {ID: 2, Name: "Teclado", Price: 3500.00, InStock: false}, } jsonArray, _ := json.Marshal(products) fmt.Println(string(jsonArray))}Resultado:
{ "id": 101, "name": "Notebook", "price": 79999.99, "tags": [ "eletrônicos", "notebooks" ], "in_stock": true}[{"id":1,"name":"Mouse","price":1500,"in_stock":true},{"id":2,"name":"Teclado","price":3500,"in_stock":false}]Parsing (Unmarshal) de JSON em Go
Parsing é o processo inverso: converter uma string JSON em uma estrutura Go. Para isso, utiliza-se a função json.Unmarshal.
Exemplo básico de parsing
package main
import ( "encoding/json" "fmt" "log")
type User struct { Username string `json:"username"` Age