Mi Blog

No te olvides seguirme en Facebook.

Tan solo tienes que hacer click en Me Gusta

 

 

x

Cómo manejar ficheros JSON con JQ

Cómo manejar ficheros JSON con JQ

(Tiempo estimado: 7 - 14 minutos)

JSON es un formato de texto sencillo para el intercambio de datos. Se trata de un subconjunto de la notación literal de objetos de JavaScript, aunque, debido a su amplia adopción como alternativa a XML, se considera un formato independiente del lenguaje. Trabajar con ficheros JSON a veces es algo tedioso ya que suelen ser ficheros "minificados" para ahorrar espacio y son poco legibles a simple vista. Por eso, el uso de jq para su parseo es sumamente útil ya que podremos ver a simple vista el formato del fichero y extraer el/los campos que queramos de forma sencilla.

Seguid leyendo y os enseñaré a manejar ficheros JSON con la herramienta jq...

 

 

¿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:

Parsear JSON con JQ y JPLAYParseo de JSON con Jplay (jq)

 

 

ENJOY!


Raúl Prieto Fernández

Sitio Web: raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

Escribir un comentario

Código de seguridad
Refescar