Encoding/JSON en Go: Marshal, Unmarshal, tags y RawMessage con ejemplos
Introducción
Cuando trabajás con APIs, archivos de configuración o cualquier formato de intercambio de datos, es muy común encontrarse con JSON. En Go, el paquete estándar encoding/json brinda todas las herramientas necesarias para marshal (serializar) y unmarshal (deserializar) estructuras de datos a y desde JSON.
Este artículo está pensado para desarrolladores que ya conocen lo básico de Go (estructuras, métodos, punteros) y quieren profundizar en el uso de encoding/json. Aprenderás:
- Cómo usar
json.Marshalyjson.Unmarshal. - Qué son los tags de campo y cómo influyen en la serialización.
- Cuándo y cómo emplear
json.RawMessagepara posponer el procesamiento de un fragmento JSON. - Buenas prácticas y errores frecuentes que suelen aparecer en proyectos reales.
Cada concepto se ilustra con ejemplos de código completos y su salida esperada, para que podés copiarlos, pegarlos y ver el resultado inmediato.
¿Qué hace exactamente el paquete encoding/json?
El paquete ofrece dos funciones principales:
func Marshal(v interface{}) ([]byte, error): toma cualquier valor Go y devuelve su representación JSON en forma de slice de bytes.func Unmarshal(data []byte, v interface{}) error: interpreta un slice de bytes con JSON y llena el valor apuntado porv.
Ambas funcionan con tipos básicos (strings, numbers, booleans), slices, maps y estructuras (struct). El mapeo entre campos de struct y claves JSON se basa en nombres de campo exportados (que empiezan con mayúscula) y, opcionalmente, en los tags que se colocan después del tipo.
Marshal básico
Veamos un ejemplo sencillo: una estructura que representa un usuario.
package main
import (
"encoding/json"
"fmt"
"log"
)
type Usuario struct {
ID int `json:"id"`
Nombre string `json:"nombre"`
Email string `json:"email"`
}
func main() {
u := Usuario{
ID: 42,
Nombre: "Ana Pérez",
Email: "ana@example.com",
}
data, err := json.Marshal(u)
if err != nil {
log.Fatalf("error al marshal: %v", err)
}
fmt.Printf("JSON resultante: %s
", data)
}Salida esperada:
JSON resultante: {"id":42,"nombre":"Ana Pérez","email":"ana@example.com"}Observá que, gracias al tag json:"id", el campo ID se serializa como `
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.