15 Trabajando con JSON en Go
Published Jun 4, 2024
🧠 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 structstring
number
→ incluye enteros y flotantesboolean
→true
ofalse
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
- Crea un struct
Book
con camposTitle
,Author
,Price
. - Decodifica un JSON con un solo libro.
- Luego decodifica un array de libros.
- Agrega un campo anidado
Publisher
que contengaName
yCountry
. - 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
yhttp.Request
.