Processamento de JSON em Go (Golang): da biblioteca padrão a ferramentas avançadas
JSON (JavaScript Object Notation) é um dos formatos de troca de dados mais populares. Em Go (Golang), o trabalho com JSON é implementado no mais alto nível graças à poderosa biblioteca padrão encoding/json e a diversas ferramentas de terceiros que aceleram e simplificam o desenvolvimento. Neste artigo, vamos detalhar como serializar, desserializar, validar e otimizar JSON em Go, além de explorar bibliotecas populares que todo desenvolvedor Go deveria conhecer.
Biblioteca padrão encoding/json
encoding/json é o pacote nativo do Go que fornece todas as funções necessárias para trabalhar com JSON. Principais funcionalidades:
- Marshaling (serialização) — conversão de estruturas Go em string JSON.
- Unmarshaling (desserialização) — parsing de string JSON para estruturas Go.
- Processamento em fluxo — leitura/escrita de JSON a partir de streams (
io.Reader,io.Writer). - Tags de estrutura — controle de nomes de campos, omissão de valores vazios, aninhamento.
Exemplo de marshaling e unmarshaling
package main
import ( "encoding/json" "fmt" "log")
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` IsActive bool `json:"is_active"`}
func main() { // Marshaling (struct -> JSON) user := User{ID: 1, Name: "Alexey", Email: "alex@example.com", IsActive: true} jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // Saída: {"id":1,"name":"Alexey","email":"alex@example.com","is_active":true}
// Unmarshaling (JSON -> struct) jsonStr := `{"id":2,"name":"Maria","email":"maria@example.com","is_active":false}` var user2 User err = json.Unmarshal([]byte(jsonStr), &user2) if err != nil { log.Fatal(err) } fmt.Printf("%+v", user2) // Saída: {ID:2 Name:Maria Email:maria@example.com IsActive:false}}Trabalhando com dados não estruturados
Às vezes, a estrutura do JSON não é conhecida antecipadamente. Nesse caso, pode-se usar map[string]interface{} ou interface{}:
func main() { jsonStr := `{"name":"Ivan","age":30,"hobbies":["leitura","esportes"]}` var data map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &data) if err != nil { log.Fatal(err) } fmt.Println(data["name"]) // Ivan fmt.Println(data["hobbies"].([]interface{})[0]) // leitura}Bibliotecas de terceiros populares
Embora encoding/json cubra a maioria das tarefas, para sistemas de alta carga ou cenários específicos, vale a pena considerar alternativas:
1. easyjson
easyjson — um gerador de código para serialização/desserialização rápida. Ele cria funções otimizadas para suas estruturas, proporcionando um ganho de desempenho de 2 a 5 vezes em comparação com a biblioteca padrão.
- Requer geração de código via
easyjson. - Suporta tipos personalizados e aninhamento.
- Ideal para microsserviços com alto RPS.
//go:generate easyjson -all user.gotype User struct { ID int `json:"id"` Name string `json:"name"`}
// Após a geração, usamos: user.MarshalJSON() / user.UnmarshalJSON()2. gjson
gjson — biblioteca para leitura rápida de JSON sem desserialização completa. Permite obter valores por caminho (análogo ao jq):
import "github.com/tidwall/gjson"
func main() { json := `{"user":{"name":"Olga","age":25}}` name := Também na biblioteca
Trabalho com imagens em Swift: redimensionamento e corte para iOS/macOS
Configuração de aplicações Kotlin: bibliotecas e ferramentas para gerenciamento de configurações
Internacionalização (i18n) em JavaScript (Node.js): biblioteca i18next
Registro em Rust: visão geral das melhores bibliotecas e soluções para o seu projeto