Encoding/JSON en Go: Marshal, Unmarshal, tags y RawMessage con ejemplos

DUGLAS MORENODUGLAS MORENO 👁 7

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.Marshal y json.Unmarshal.
  • Qué son los tags de campo y cómo influyen en la serialización.
  • Cuándo y cómo emplear json.RawMessage para 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 por v.

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 `

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario