15 Trabajando con JSON en Go

Published Jun 4, 2024

GoProgrammingjson

🧠 Introducción

JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos, fácil de leer y escribir para humanos, y fácil de procesar para las máquinas. En Go, trabajamos con JSON mediante el paquete estándar encoding/json.

1. 🌐 Tipos de datos soportados por JSON

  • object → diccionario o struct
  • string
  • number → incluye enteros y flotantes
  • booleantrue o false
  • array
  • null

⚠️ No existe tipo date en JSON. Si necesitas enviar fechas, usa strings con formato ISO-8601.

2. 🔍 ¿Qué significa "decodificar JSON"?

Cuando recibimos un JSON desde un servidor (por ejemplo, desde un API), lo hacemos como un string. Para poder trabajar con esos datos en Go, necesitamos convertirlo a una estructura (struct) con tipos reales de Go: esto se llama decoding o unmarshalling.

3. 🔧 Preparar tu struct

Para hacer la conversión, debes tener un struct que refleje la forma del JSON:

type User struct {
	Username string
	Id       int
}

Es importante usar los tipos correctos (int, string, etc.) para evitar errores o hacer conversiones innecesarias.

4. 🧪 Decodificar un JSON simple

jsonString := `{ "username": "elprogramadorgt", "id": 8}`
var user User

err := json.Unmarshal([]byte(jsonString), &user)

if err != nil {
	log.Fatal(err)
}
fmt.Println(user.Username) // "elprogramadorgt"

💡 ¿Por qué []byte y &user?

  • Unmarshal requiere un []byte, no un string.
  • Le pasamos &user porque la función debe modificar la variable directamente (paso por referencia).

5. 🔁 Decodificar un arreglo de objetos

Solo cambia el tipo de variable a un slice:

var users []User
jsonString := `[{"username":"elprogramadorgt","id":8},{"username":"pythonisto","id":10}]`

json.Unmarshal([]byte(jsonString), &users)
fmt.Println(users[1].Username) // "pythonisto"

6. 📦 JSON anidado (JSON dentro de JSON)

Cuando un campo dentro del JSON es otro objeto, debes reflejarlo en el struct como otro struct:

type User struct {
	Username string
	Id       int
	UserInfo struct {
		Name     string
		Timezone string
	}
}

O separarlo para mayor limpieza:

type UserInfo struct {
	Name     string
	Timezone string
}

type User struct {
	Username string
	Id       int
	UserInfo UserInfo
}

🧪 Ejemplo completo:

jsonString := `[
	{"username": "elprogramadorgt", "id": 8,
		"userInfo": {"name": "Edu", "timezone":"GTM-6"}},
	{"username": "pythonisto", "id": 10,
		"userInfo": {"name": "Pythonisto", "timezone":"GTM-3"}}
]`

var users []User
json.Unmarshal([]byte(jsonString), &users)

fmt.Println(users[1].UserInfo.Timezone) // "GTM-3"

✅ Conclusión

  • El paquete encoding/json permite decodificar y trabajar con JSON en Go.
  • Es necesario crear structs que coincidan con la estructura del JSON.
  • Usa json.Unmarshal([]byte, &variable) para convertir un JSON string en un struct.
  • Puedes decodificar arrays, objetos anidados y mucho más.

🛠️ Práctica recomendada

  1. Crea un struct Book con campos Title, Author, Price.
  2. Decodifica un JSON con un solo libro.
  3. Luego decodifica un array de libros.
  4. Agrega un campo anidado Publisher que contenga Name y Country.
  5. Imprime cada libro con su editor.

🚀 Siguientes pasos

Una vez domines el decoding, te recomiendo aprender:

  • 📨 Encoding: cómo convertir structs de Go a JSON con json.Marshal.
  • ✍️ Etiquetas de campos (json:"campo_json") para controlar nombres y omisiones.
  • 🔐 Uso en APIs reales con http.ResponseWriter y http.Request.