Procesamiento de JSON en Go (Golang): desde la biblioteca estándar hasta herramientas avanzadas
JSON (JavaScript Object Notation) es uno de los formatos de intercambio de datos más populares. En Go (Golang), el trabajo con JSON está implementado al más alto nivel gracias a la potente biblioteca estándar encoding/json y a múltiples herramientas de terceros que aceleran y simplifican el desarrollo. En este artículo, analizaremos en detalle cómo serializar, deserializar, validar y optimizar JSON en Go, así como las bibliotecas populares que todo desarrollador Go debería conocer.
Biblioteca estándar encoding/json
encoding/json es un paquete integrado de Go que proporciona todas las funciones necesarias para trabajar con JSON. Las principales capacidades son:
- Marshaling (serialización) — conversión de estructuras Go a cadenas JSON.
- Unmarshaling (deserialización) — análisis de cadenas JSON a estructuras Go.
- Procesamiento por flujo — lectura/escritura de JSON desde flujos (
io.Reader,io.Writer). - Etiquetas de estructura — control de nombres de campos, omisión de valores vacíos, anidamiento.
Ejemplo de marshaling y 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 (estructura -> JSON) user := User{ID: 1, Name: "Алексей", Email: "alex@example.com", IsActive: true} jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // Salida: {"id":1,"name":"Алексей","email":"alex@example.com","is_active":true}
// Unmarshaling (JSON -> estructura) jsonStr := `{"id":2,"name":"Мария","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) // Salida: {ID:2 Name:Мария Email:maria@example.com IsActive:false}}Trabajo con datos no estructurados
A veces la estructura del JSON no se conoce de antemano. En este caso, se puede usar map[string]interface{} o interface{}:
func main() { jsonStr := `{"name":"Иван","age":30,"hobbies":["чтение","спорт"]}` var data map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &data) if err != nil { log.Fatal(err) } fmt.Println(data["name"]) // Иван fmt.Println(data["hobbies"].([]interface{})[0]) // чтение}Bibliotecas de terceros populares
Aunque encoding/json cubre la mayoría de las tareas, para sistemas de alta carga o escenarios específicos vale la pena considerar alternativas:
1. easyjson
easyjson es un generador de código para serialización/deserialización rápida. Crea funciones optimizadas para sus estructuras, lo que proporciona un aumento de rendimiento de 2 a 5 veces en comparación con la biblioteca estándar.
- Requiere generación de código mediante
easyjson. - Admite tipos personalizados y anidamiento.
- Ideal para microservicios con alto RPS.
//go:generate easyjson -all user.gotype User struct { ID int `json:"id"` Name string `json:"name"`}
// Después de la generación usamos: user.MarshalJSON() / user.UnmarshalJSON()2. gjson
gjson es una biblioteca para lectura rápida de JSON sin deserialización completa. Permite obtener valores por ruta (análogo a jq):
import "github.com/tidwall/gjson"
func main() { json := `{"user":{"name":"Ольга","age":25}}` name :=