Contenido del curso

Estructuras de Datos y Funciones

JSON con Marshal y Unmarshal en Go

Resumen

Trabajar con JSON en Go es una de las habilidades base para conectar APIs, mover datos entre sistemas y construir aplicaciones reales. Aquí aprendes a convertir un objeto en JSON y un JSON en objeto usando los métodos Marshal y Unmarshal del paquete encoding/json, con ejemplos prácticos que puedes replicar.

Cómo organizar el proyecto antes de codificar JSON en Go

Antes de escribir una sola línea, conviene preparar la estructura de carpetas. En Go existe una regla silenciosa pero estricta: no debes tener dos archivos main.go dentro de la misma carpeta, porque el compilador lo interpreta como un conflicto.

La solución es separar cada ejercicio en su propio directorio. Crea una carpeta json y dentro dos subcarpetas:

  • encode, donde vivirá el ejemplo que convierte un objeto en JSON.
  • decode, donde vivirá el ejemplo que convierte un JSON en objeto.
  • Cada una con su propio main.go.

Esta separación mantiene una relación uno a uno entre carpeta y archivo ejecutable, y evita errores al compilar.

¿Por qué Go no permite dos main.go en la misma carpeta? Porque cada paquete main define un único punto de entrada. Si hay dos, el compilador no sabe cuál ejecutar.

Cómo convertir un struct en JSON con Marshal

El proceso de encoding toma una estructura de Go y la transforma en una cadena con formato JSON. Para esto necesitas dos paquetes: fmt para imprimir y encoding/json para la conversión.

El truco está en la definición del struct. Junto a cada campo puedes agregar una tag entre acentos graves que indica cómo se llamará esa propiedad en el JSON final. Esto resuelve un problema común: que tus variables en Go usen una convención (mayúscula inicial, nombres en español) y el JSON requiera otra (minúsculas, nombres en inglés).

go type Persona struct { Nombre string json:"name" Edad int json:"age" Email string json:"email" }

Una vez declarada la estructura, creas una instancia con datos y la pasas a json.Marshal. Este método devuelve dos valores: el resultado en bytes y un error.

go p := Persona{Nombre: "Amin Espinosa", Edad: 40, Email: "aminespinosa@platzi.com"} jsonData, err := json.Marshal(p) if err == nil { fmt.Println("Tu archivo JSON es:", string(jsonData)) }

Validar que err sea nil es obligatorio. Si la conversión falla, normalmente es porque algún campo del struct no es compatible con el formato JSON esperado.

Por qué convertir bytes a string al imprimir

Marshal devuelve un slice de bytes, no una cadena directamente legible. Para verlo en consola con un formato humano, lo conviertes con string(jsonData). Sin esa conversión verías una secuencia de números ASCII en lugar del JSON con llaves y comillas.

Cómo convertir un JSON en struct con Unmarshal

El camino inverso se llama decoding y usa el método json.Unmarshal. La nemotecnia es directa: Marshal codifica, Unmarshal decodifica.

Aquí el reto inicial es escribir el JSON dentro del código Go. Si usas comillas dobles para abrir la cadena, las comillas internas del JSON rompen la sintaxis. La solución es delimitar la cadena con acentos graves, que en Go funcionan como raw string literals y permiten incluir comillas dobles sin escapar nada.

go jsonString := {"name":"Amin Espinosa","age":40,"email":"aminespinosa@platzi.com"} var p Persona err := json.Unmarshal([]byte(jsonString), &p) if err != nil { fmt.Println("Hubo un problema:", err) } fmt.Println(p.Nombre, p.Edad, p.Email)

Fíjate en dos detalles clave:

  • Unmarshal recibe un slice de bytes, por eso conviertes el string con []byte(...).
  • Pasas la dirección de memoria del struct con &p, porque Unmarshal necesita modificar la variable original.

¿Cuál es la diferencia entre Marshal y Unmarshal en Go? Marshal toma un objeto Go y lo convierte en JSON. Unmarshal toma un JSON y rellena un objeto Go con esos datos. Uno serializa, el otro deserializa.

Cómo manejar errores en la conversión

Tanto Marshal como Unmarshal devuelven un valor de tipo error. Ignorarlo es una mala práctica, porque enmascara problemas como campos mal nombrados, tipos incompatibles o JSON mal formado. La verificación if err != nil debe acompañar siempre estas operaciones.

Habilidades y conceptos que practicas en este flujo

Este ejercicio entrena varias capacidades técnicas que vas a reutilizar en cualquier proyecto con APIs:

  • Definición de struct tags con acentos graves para mapear nombres entre Go y JSON [1:30].
  • Uso del paquete encoding/json de la librería estándar [0:55].
  • Patrón de manejo de errores con valor de retorno doble [3:20].
  • Conversión entre []byte y string para imprimir resultados [4:10].
  • Uso de raw string literals con backticks para JSON embebido [6:15].
  • Paso por referencia con & para que Unmarshal modifique el struct [7:00].

Dominar estos seis puntos te deja listo para consumir cualquier API REST en Go sin depender de librerías externas. ¿Ya probaste convertir tu propio struct en JSON? Cuéntame en los comentarios qué estructura usaste.