Saltar a contenido

Tratamiendo JSON

1.JQ, ¿Que es?

Existe una utilidad (jq) [https://stedolan.github.io/jq/] que facilita el manejo de estructuras json desde shell script.

2.Instalacion

Ve a la pagina oficial y busca el instalador para tu sistema operativo. (https://stedolan.github.io/jq/download/)[https://stedolan.github.io/jq/download/]

3.Leyendo un fichero JSON

Tenemos un fichero mi_fichero.json

{
    "artifactId": "commons-lang3", 
    "groupId": "org.apache.commons",
    "version":"3.12.0"
}

Este ejemplo de script lo parsea y obtenemos los valores:

#!/bin/bash

# Obtengo el valor del fichero en una variable
COMMONS_LANG_VERSION=$(cat ./docs/mi_fichero.json)

# Parseo el contenido con jq y obtengo el valor del nodo que me interesa 
# (el operador -r hace que nos devuelva el interior del string 3.12.0, en vez de "3.12.0" con comillas)
COMMONS_LANG_VERSION=$(echo $COMMONS_LANG_VERSION | jq -r '.version')
echo $COMMONS_LANG_VERSION   # Esto printea 3.12.0

COMMONS_LANG_GROUPID=$(echo $COMMONS_LANG_VERSION | jq -r '.groupId')
echo $COMMONS_LANG_GROUPID   # Esto printea org.apache.commons

4.Leyendo un fichero con array JSON y objetos anidados + filtrado

Imaginemos el fichero personas.json que es un array de objetos y dentro de esos objetos hay objetos anidados:

[
    {
        "friendlyName": "El burbujas",
        "name": "Jose Luis",
        "description": "Un tipo vulgar pero con carisma",
        "direccion": {
            "calle": "Avenida parqueMonte", 
            "numero": "37"
        }
    },{
        "friendlyName": "El santo",
        "name": "Paco Francis",
        "description": "Siempre te echa la culpa de todo",
        "direccion": {
            "calle": "el cielo", 
            "numero": "12"
        }
    },{
        "friendlyName": "Morat",
        "name": "Ramon",
        "description": "es bastante feo",
        "direccion": {
            "calle": "Del rio", 
            "numero": "12"
        }
    }
]

Veamos un shell script que obtenga los datos de Ramon

#!/bin/bash

#Vamos a buscar los datos usando el select()
RAMON_INFO=$(cat ./docs/personas.json | jq -c '.[] | select(.name | contains("Ramon"))')
RAMON_INFO_CALLE=$(echo $RAMON_INFO | jq -r '.direccion.calle') 
echo $RAMON_INFO_CALLE  # Del rio

5.Conclusion

Hemos visto como con JQ podemos parsear y leer estructuras complejas con Bash scripts.