Introducción al trabajo con JSON en Go
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos, ampliamente utilizado en desarrollo web, API y archivos de configuración. El lenguaje Go (Golang) proporciona el paquete integrado encoding/json, que permite realizar fácilmente el análisis (decodificación) y la serialización (codificación) de datos. En este artículo, exploraremos los fundamentos del trabajo con JSON en Go mediante ejemplos prácticos, comprensibles incluso para desarrolladores principiantes.
Fundamentos del paquete encoding/json
El paquete encoding/json es una biblioteca estándar de Go que no requiere instalación adicional. Las dos herramientas principales en este paquete son las funciones json.Marshal (serialización) y json.Unmarshal (deserialización).
Estructuras y etiquetas JSON
En Go, los datos generalmente se representan mediante estructuras (struct). Para controlar los nombres de los campos en JSON se utilizan etiquetas. Veamos un ejemplo simple:
package main
import ( "encoding/json" "fmt")
// Definimos una estructura con etiquetas JSONtype Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` IsAdmin bool `json:"is_admin"`}
func main() { // Creamos una instancia de la estructura person := Person{ Name: "Iván Petrov", Age: 30, Email: "ivan@example.com", IsAdmin: true, } // Serializamos a JSON jsonData, _ := json.Marshal(person) fmt.Println(string(jsonData))}Resultado de la ejecución:
{"name":"Iván Petrov","age":30,"email":"ivan@example.com","is_admin":true}Puntos importantes:
- La etiqueta
json:"name"indica cómo se llamará el campo en JSON - La opción
omitemptyomite campos vacíos (valores cero) - Los campos de la estructura deben ser exportables (comenzar con mayúscula)
Serialización (Marshal) de datos a JSON
La serialización es el proceso de convertir una estructura de Go u otro tipo de datos en una cadena JSON. La función json.Marshal devuelve un segmento de bytes ([]byte) y un error.
Ejemplos de serialización de diferentes tipos
package main
import ( "encoding/json" "fmt")
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Tags []string `json:"tags,omitempty"` InStock bool `json:"in_stock"`}
func main() { // Serialización de una estructura product := Product{ ID: 101, Name: "Portátil", Price: 79999.99, Tags: []string{"electrónica", "portátiles"}, InStock: true, } // Salida formateada con sangría jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // Serialización de un slice de estructuras products := []Product{ {ID: 1, Name: "Ratón", Price: 1500.00, InStock: true}, {ID: 2, Name: "Teclado", Price: 3500.00, InStock: false}, } jsonArray, _ := json.Marshal(products) fmt.Println(string(jsonArray))}Resultado:
{ "id": 101, "name": "Portátil", "price": 79999.99, "tags": [ "electrónica", "portátiles" ], "in_stock": true}[{"id":1,"name":"Ratón","price":1500,"in_stock":true},{"id":2,"name":"Teclado","price":3500,"in_stock":false}]Análisis (Unmarshal) de JSON en Go
El análisis es el proceso inverso: convertir una cadena JSON en una estructura de Go. Para esto se utiliza la función json.Unmarshal.
Ejemplo básico de análisis
package main
import ( "encoding/json" "fmt" "log")
type User struct { Username string `json:"username"` Age