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
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.