Processamento de JSON em Go (Golang): encoding/json, bibliotecas e exemplos

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

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 :=

Recommendations