3

Paso a paso: cómo trabajar con JSON en Go

1337Puntos

hace 9 años

Nota de Platzi: Go es un lenguaje de programación muy versátil. En este guest post, nuestro estudiante Juan Castro Lurita comparte un tutorial sobre uno de sus usos más útiles. Sabías que en Go también es posible trabajar con JSON? Primero, un recordatorio: JSON significa JavaScript Object Notation ('notación de objetos JavaScript'), y se trata de un formato muy cómodo para intercambiar datos en aplicaciones. Podrás leer más a su respecto en su página oficial, json.org, pero la principal información que quiero destacar es su simplicidad, ya que es fácilmente leído por las aplicaciones. En otras palabras, con JSON es más fácil leer y escribir datos en tus aplicaciones Go; te voy a explicar paso a paso cómo funciona.

Instanciando la librería JSON en Go

Al inicio de nuestro código debemos instanciar las siguientes librerías mínimas para poder trabajar con JSON:
package main

import (
    "encoding/json"
    "fmt"
)

Encoding con Marshal

La función Json.Marshal recibe los datos con las características de mi objeto en bytes para luego convertirlos a JSON. La sintaxis de esta función es la siguiente:
func Marshal(v interface{}) ([]byte, error)
Veamos un ejemplo usando json.Marshal. Tenemos un auto con ciertas características como Modelo, Año, Kilometraje, Color, Capacidad de Almacenamiento de Gasolina en el Tanque y si es Usado o no. Creamos un archivo de ejemplo llamado ejemplo_marshal.go:
// Instancio Go y JSON
package main

import (
 "encoding/json"
 "fmt"
)

// Defino los tipos de Datos de mi aplicación.
type Auto struct {
 ID int
 Modelo string
 Año string
 Kilometraje string
 Color string
 Tanque string
 Usado bool
}

// Creamos una Instancia con las Características del Auto.
func main() { 
 auto := Auto{
 ID: 1,
 Modelo: "Toyota Yaris",
 Año: "2014",
 Kilometraje: "120 Km x Hora",
 Color: "Amarillo",
 Tanque: "10 Litros",
 Usado: true,
 }
 
 // Creamos nuestro JSON a partir de los datos que obtenemos desde la instancia Creada con las Características del Auto. 
 crear_json, _ := json.Marshal(auto)
 
 // Convertimos los datos(bytes) en una cadena e imprimimos el contenido.
 convertir_a_cadena := string(crear_json)
 fmt.Println(convertir_a_cadena)
}
Luego de ejecutar el comando:
go run ejemplo_marshal.go
Obtemos el resultado siguiente:
{"ID":1,"Modelo":"Toyota Yaris","Año":"2014","Kilometraje":"120 Km x Hora","Color":"Amarillo","Tanque":"10 Litros","Usado":true}

Encoding con Unmarshal

Esta función nos ayuda a deserializar nuestro array JSON de manera a obtener datos útiles. Asimismo podemos emplearlo para afectar la estructura del JSON a mostrarse y muchas más tareas. La sintaxis de esta función es la siguiente:
func Unmarshal(data []byte, v interface{}) error
Ahora veamos un ejemplo usando json.Unmarshal. Imaginemos que tenemos una lista de edades de ciertas Personas y que deseamos la cantidad de edades que existen dentro de ese array. Creamos un archivo de ejemplo llamado ejemplo_unmarshal.go:
// Instancio JSON.

package main

import (
 "encoding/json"
 "fmt"
)

type Resultados struct {
 Edades []int
}

func main() {
 // Defino los objetos de mi array JSON.
 text := "{\"Edades\": [18, 20, 30, 35, 50, -12]}"
 // Get bytes.
 bytes := []byte(text)

 // Decodifico la estructura con Unmarshal.
 var resultados Resultados
 json.Unmarshal(bytes, &resultados)

 // Obtenemos los datos.
 fmt.Printf("Edades = %v", resultados.Edades)
 fmt.Println()
 // Contamos la cantidad de objetos en mi array y los imprimo.
 fmt.Printf("Cantidad = %v", len(resultados.Edades))
 fmt.Println()
}


Luego de ejecutar el comando:
go run ejemplo_unmarshal.go
Obtenemos un array de datos con las edades y la cantidad de edades que hay en el array
Edades = [18 20 30 35 50 -12]
Cantidad = 6
 

Decodificación arbitraria de datos

Imaginemos que tenemos un solo modelo de auto pero que este tiene 5 colores; entonces debemos asignarle una columna llamada Colores dentro del array json:
auto := []byte(`{"ID:1, Modelo: Kia Picasso, Año: 2016, Kilometraje: 120 Km x hora, Tanque: 15 Litros, Usado: false, Colores":["Plateado, Rojo, Azul, Negro, Verde"]}`)
Para leer este subdato 'colores' del objeto auto, empleamos lo siguiente:
map[string]interface{}:
Entonces si creamos un archivo llamado ejemplo_da.go, queda así:
// Instancio Go y JSON
package main

import (
    "encoding/json"
    "fmt"
)

// Defino los tipos de Datos de mi aplicación.
type Auto struct {
  ID int
  Modelo string  
  Año  string
  Kilometraje string  
  Tanque string
  Usado   bool
  Colores  []string
}

// Creamos una Instancia con las Características del Auto.
func main() {
  auto := []byte(`{"ID:1, Modelo: Kia Picasso, Año: 2016, Kilometraje: 120 Km x hora, Tanque: 15 Litros, Usado: false, Colores":["Plateado, Rojo, Azul, Negro, Verde"]}`)

  
    // Creamos nuestro JSON a partir de los datos que obtenemos desde la instancia Creada con las Características del Auto.   
    var colores interface{}
    json.Unmarshal(auto, &colores)
    
    m := colores.(map[string]interface{})
  
    // Convertimps los datos(bytes) en una cadena e imprimimos el contenido.    
    fmt.Println(m)    
}

También puedes ver arriba que obtenemos un array con las características del auto y los colores de su modelo luego de ejecutar el comando
 go run ejemplo_da.go
//Resultado

map[ID:1, Modelo: Kia Picasso, Año: 2016, Kilometraje: 120 Km x hora, Tanque: 15 Litros, Usado: false, Colores:[Plateado, Rojo, Azul, Negro, Verde]]
Si te interesa este tema, puedes aprender mucho más en el curso avanzado de Go en Platzi por el profesor Ivan Jaimes.

[maxbutton id="2"]

Juan Ricardo
Juan Ricardo
pepoflex

1337Puntos

hace 9 años

Todas sus entradas
Escribe tu comentario
+ 2
1
311Puntos
6 años

De una pagina con formato JSON le puedo cambiar la interfaz para que un usuario lo puede diligenciar mejor?