¿QUÉ ES JQ?
JQ es una herramienta de consola que sirve para manejar y parsear ficheros JSON. Con jq podemos filtrar, buscar y mostrar de forma "bonita" el resultado de un JSON en lugar de en una sola línea. Se pueden realizar operaciones sencillas y operaciones complejas a la hora de definir los filtros.
Manejar ficheros JSON con JQ es muy sencillo
1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL
- Un PC con GNU/Linux (cualquier distribución)
- Internet (recomendado)
2.- DESCARGAR E INSTALAR JQ
JQ es muy sencillo de instalar en cualquier distribución de GNU/Linux. Al no depender de ningún paquete externo, podremos simplemente descargar el programa compilado y ejecutarlo. Aunque también se puede instalar a través de los repositorios oficiales de cada distribución, en este tutorial os voy a enseñar como descargarlo de forma manual. Para ello, visitaremos la Web Oficial de JQ y dentro de la sección de Downloads descargaremos la versión para nuestro Sistema Operativo https://stedolan.github.io/jq/download/. Para realizar la descarga desde consola con Wget, para la versión actual 1.6 y 64 bits, ejecutaremos el siguiente comando:
raul@debian:~$ sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O /usr/bin/jq
Una vez descargado jq, le asignaremos permisos de ejecución:
raul@debian:~$ sudo chmod +x /usr/bin/jq
Para comprobar si se ha instalado correctamente jq, ejecutaremos el comando siguiente:
raul@debian:~$ jq
jq - commandline JSON processor [version 1.6]
Usage: jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.
The simplest filter is ., which copies jq's input to its output
unmodified (except for formatting, but note that IEEE754 is used
for number representation internally, with all that that implies).
For more advanced filters see the jq(1) manpage ("man jq")
and/or https://stedolan.github.io/jq
Example:
$ echo '{"foo": 0}' | jq .
{
"foo": 0
}
For a listing of options, use jq --help.
3.- PRIMEROS PASOS CON JQ
Usar jq es muy sencillo. Vamos a aprender primeramente un par de comandos básicos (lo más básicos) antes de pasar a comandos un poco más avanzados. A modo de ejemplo, crearemos un fichero json en una única línea con el siguiente contenido en un fichero llamado basic.json:
{ "nombre":"Juan", "edad":30, "coche":"Ferrari" }
Para formatear el json en un formato más legible, ejecutaremos el siguiente comando:
raul@debian:~$ jq '.' basic.json
{
"nombre": "Juan",
"edad": 30,
"coche": "Ferrari"
}
Si queremos obtener el valor de una de las propiedades, por ejemplo de la propiedad "nombre", ejecutaremos:
raul@debian:~$ jq '.nombre' basic.json
"Juan"
4.- UTILIZAR JQ CON MATRICES
Jq también es capaz de manejar matrices al igual que objetos. Por ejemplo, si le pasamos una matriz de 5 números podemos visualizar toda la matriz utilizando el siguiente comando:
raul@debian:~$ echo '[1,2,3,4,5]' | jq '.'
[
1,
2,
3,
4,
5
]
Si por ejemplo, queremos obtener el valor que hay en la posición 2,(recodemos que las posiciones empiezan en 0), ejecutaremos el siguiente comando:
raul@debian:~$ echo '[1,2,3,4,5]' | jq '.[2]'
3
También jq puede manejar matrices anidadas. Por ejemplo:
raul@debian:~$ echo '[["a","e","i","o","u"],1,2,3,4,5]' | jq '.'
[
[
"a",
"e",
"i",
"o",
"u"
],
1,
2,
3,
4,
5
]
Si quereos obtener el valor del último valor (posición 4), de la sub-matriz que hay en la posición 0 de la matriz principal, ejecutaremos lo siguiente:
raul@debian:~$ echo '[["a","e","i","o","u"],1,2,3,4,5]' | jq '.[0][4]'
"u"
5.- UTILIZAR JQ CON OBJETOS
Jq también puede trabajar con objetos dentro de ficheros JSON. Por ejemplo, si queremos mostrar un JSON con objetos de forma más visual, ejecutaremos:
raul@debian:~$ echo '{"usuario":{"nombre":"juan","apellidos":"ruiz gil"}}' | jq '.'
{
"usuario": {
"nombre": "juan",
"apellidos": "ruiz gil"
}
}
Por ejemplo, si queremos extraer el valor de la propiedad nombre del objeto usuario, ejecutaremos el siguiente comando:
raul@debian:~$ echo '{"usuario":{"nombre":"juan","apellidos":"ruiz gil"}}' | jq '.usuario.nombre'
"juan"
6.- EJEMPLO REAL CON JQ
En este apartado vamos a imaginarnos un posible y sencillo escenario real. En un servidor web remoto, colgaremos cada X tiempo un fichero JSON con una determinada estructura en el cual se detallan el nombre de N directorios. Crearemos un pequeño script en bash que llame a dicho JSON y obtenga el listado de todos los valores de los nombres de los directorios. Una vez obtenida la lista, se crearán dichos directorios en caso de no existir.¡Muy sencillo!
El contenido del fichero dirs.json es el siguiente:
{
"dirs":[
{
"id":"dir1",
"title":"title1"
},
{
"id":"dir2",
"title":"title2"
},
{
"id":"dir3",
"title":"title3"
},
{
"id":"dir4",
"title":"title4"
},
{
"id":"dir5",
"title":"title5"
}
]
}
En el servidor, el JSON dirs.json estará "minificado" y tendrá el siguiente aspecto:
{"dirs":[{"id":"dir1","title":"title1"},{"id":"dir2","title":"title2"},{"id":"dir3","title":"title3"},{"id":"dir4","title":"title4"},{"id":"dir5","title":"title5"}]}
Crearemos el siguiente fichero en Bash create_dirs.sh , que lo que hace es obtener todos los "titles" de los directorios y en caso de no existir, los crea en el directorio donde se ha ejecutado el script:
#!/bin/bash
for i in `curl -s https://www.raulprietofernandez.net/images/blog/264/dirs.json | jq -r '.dirs[].id'`;
do
if [ -d $i ];
then
echo "El directorio $i ya existe."
else
echo "Creando el directorio $i"
mkdir $i;
fi
done
Asignamos permisos de ejecución en el script:
raul@debian:~$ chmod +x create_dirs.sh
Si ejecutamos por primera vez el script, se crearán los 5 directorios ya que ninguno de ellos existe:
raul@debian:~$ ./create_dirs.sh
Creando el directorio dir1
Creando el directorio dir2
Creando el directorio dir3
Creando el directorio dir4
Creando el directorio dir5
Comprobamos que los 5 directorios se han creado correctamente:
raul@debian:~$ find . -iname "dir*"
./dir1
./dir2
./dir3
./dir4
./dir5
Si volvemos a ejecutar el script, veremos que los directorios no se vuelven a crear, ya que todos ellos existen:
raul@debian:~$ ./create_dirs.sh
El directorio dir1 ya existe.
El directorio dir2 ya existe.
El directorio dir3 ya existe.
El directorio dir4 ya existe.
El directorio dir5 ya existe.
Borraremos el directorio "dir5" para comprobar lo que hace el script:
raul@debian:~$ rmdir dir5/
Si ejecutamos ahora el script, se reciben los 5 directorios pero solamente se creará el "dir5" ya que no existe en local:
raul@debian:~$ ./create_dirs.sh
El directorio dir1 ya existe.
El directorio dir2 ya existe.
El directorio dir3 ya existe.
El directorio dir4 ya existe.
Creando el directorio dir5
Volvemos a comprobar y efectivamente, se ha vuelto a crear el directorio "dir5":
raul@debian:~$ find . -iname "dir*"
./dir1
./dir2
./dir3
./dir4
./dir5
El ejemplo anterior, es un ejemplo sencillo de como podemos usar jq, pero podemos complicarlo tanto como queramos.
7.- JQPLAY
JPlay es un GUI web para JQ el cual nos posibilita probar rápidamente el parseo de los JSON y el comando que debemos utilizar para obtener lo que queremos. Es muy sencillo de utilizar, solamente hay que entrar en su web https://jqplay.org/, pegar el JSON y en el "filter" introducir lo que queremos filtrar. A la derecha aparecerá instantáneamente el resultado del filtro sobre el JSON:
Parseo de JSON con Jplay (jq)
ENJOY!