Son muchas las API que utilizan ficheros JSON para enviar y recibir datos. Por ejemplo es normal que una aplicación web pueda enviar datos dentro de un fichero JSON a una aplicación móvil para que la aplicación móvil pueda mostrar los datos en una interfaz de usuario amigable. Por esto motivo resulta interesante conocer algún método simple y sencillo para poder extraer los datos que queramos de los ficheros JSON. Por lo tanto, a continuación explicaremos como podemos extraer datos de un fichero JSON con la ayuda de la herramienta jq.
¿QUÉ SON LOS ARCHIVOS CON FORMATO JSON?
JSON es un formato de intercambio de datos. Los ficheros JSON contienen datos de una forma estructurada y fácilmente legibles tanto para humanos como para computadoras. La estructura de los datos que tienen los ficheros JSON es la siguiente.
Muestra de lo que es un objeto, un nombre y un valor en JSON
En JSON podemos definir objetos, nombres y valores de la siguiente forma:
{
"nombre": "Joan",
"apellido": "Geekland",
"edad": 32
}
En el ejemplo que acabamos de detallar vemos lo siguiente:
- Hay un objeto JSON. Cada uno de los objetos JSON se delimita por los símbolos
{}
. - El objeto JSON contiene 3 pares nombre/valor que en este caso describen información de una persona. Cada uno de los nombres y de los valores está entre comillas y se usa
:
para separar el nombre del valor. Por lo tanto tendríamos el nombrenombre
cuyo valor seríaJoan
, el nombreapellido
cuyo valor seríaGeekland
y finalmente el nombreedad
cuyo valor sería32
. - A nota informativa pueden existir objetos dentro de otros objetos.
Muestra de lo que es una array JSON
Los ficheros JSON también pueden contener arrays. Si al ejemplo anterior queremos añadir una array que contenga dos objetos y que a su vez contengan dos pares de nombre/valor lo haremos del siguiente modo:
{
"nombre": "Joan",
"apellido": "Geekland",
"edad": 32,
"trabajosRealizados": [
{
"empresa": "Geekland SA.",
"puesto": "CEO"
},
{
"empresa": "Linux SL.",
"puesto": "Programador"
}
]
}
Si observan el ejemplo podrán ver que:
- Toda Array va delimitada entre los símbolos
[]
. - La Array
trabajosRealizados
mostrará todos los trabajos realizados por una determinada persona. La ArraytrabajosRealizados
tiene 2 objetos y cada uno de los objectos tiene 2 pares de nombre/valor que detallan información cada uno de los trabajos realizados por una determinada persona.
Los objetos y las Array puedan anidarse dentro de otros objetos y Array. Por lo tanto podemos crear una estructura de datos extensa y flexible. Si partimos del ejemplo anterior podemos añadir la Array puestosTrabajo
dentro de la Array trabajosRealizados
del siguiente modo:
{
"nombre": "Joan",
"apellido": "Geekland",
"edad": 32,
"trabajosRealizados": [
{
"empresa": "Geekland SA.",
"puestosTrabajo": [
{
"primero": "programador",
"segundo": "CEO"
}
]
},
{
"empresa": "Linux SL.",
"puesto": "Programador"
}
]
}
De este modo podemos especificar la totalidad de trabajos que una persona ha realizado dentro de una empresa.
EXTRAER DATOS DE LOS FICHEROS JSON CON LA UTILIDAD JQ
Acabamos de ver la estructura en que JSON almacena la información. Para poder extraer datos concretos del fichero JSON podemos utilizar la herramienta jq.
Nota: Existen otras herramientas como sed, awk, cut, etc que permiten extraer formatos datos de un archivo. Pero en el caso de ficheros json es mucho más sencillo y efectivo usar jq.
¿Qué es la herramienta jq?
jq es una herramienta de terminal multiplafatorma presente en Linux, macOS y Windows. La herramienta permite filtrar, extraer, buscar o modificar los datos dentro de un fichero JSON. Algunos usos específicos que podemos dar a jq son:
- Extraer y/o consultar elementos específicos almacenados en un ficheor JSON
- Filtrar datos mediante la función
select
según los criterios que nosotros podamos definir. - Transformar/modificar los datos existentes dentro de un fichero JSON gracias a la función
map
. - Modificar el valor de un nombre. Por ejemplo con la función
gsub
podemos reemplazar todos los espacios por _. - Agregar objetos y elementos dentro de un fichero JSON.
- Combinar los datos de múltiples ficheros JSON en un solo fichero JSON mediante la función
input
. - Mediante la función
add
podemos sumar los elementos númericos almacenados en una matriz.
- Ordenar datos mediante la función
sort
. - Etc.
jq se trata de un herramienta útil y versátil que dispone de innumerables funciones para trabajar con ficheros JSON. Algunas de estas funciones son del
, max
, min
, unique
, contain
, join
, etc. De la multitud de utilidades de jq únicamente nos centraremos en extraer los datos contenidos en ficheros JSON.
Instalar jq en Linux para extraer datos de ficheros json
jq se encuentra en los repositorios de prácticamente la totalidad de distribuciones Linux. Por lo tanto para instalar jq en distribuciones que usen el gestor de paquetes apt deberán ejecutar el siguiente comando :
sudo apt install jq
Si su distribución usa el gestor de paquetes dnf entonces deberán ejecutar el siguiente comando:
sudo dnf install jq
Finalmente si usan el gestor de paquetes Pacman:
sudo pacman -Sy jq
Extraer el valor de un determinado nombre de un fichero JSON con jq
Para extraer el valor del nombre apellido
del fichero JSON samplegeekland.json
que tiene el siguiente contenido:
{
"nombre": "Joan",
"apellido": "Geekland",
"edad": 32
}
Tan solo tendremos que ejecutar el siguiente comando:
❯ jq .apellido samplegeekland.json
"Geekland"
Si queremos que el resultado no muestre las comillas tan solo tendremos añadir la opción -r
del siguiente modo:
❯ jq -r .nombre samplegeekland.json
Joan
Extraer el valor de varios nombres de forma simultanea de un fichero JSON
Si ahora queremos obtener el valor de más de un nombre lo haremos del siguiente modo:
❯ jq -r ".nombre, .apellido, .edad" samplegeekland.json
Joan
Geekland
32
Extraer el valor de un determinado nombre especificando el número de dígitos de la salida
Para hacer que el resultado obtenido no tenga más de por ejemplo 6 podemos realizar lo siguiente. Imaginemos que el fichero samplegeekland.json
tiene el siguiente contenido:
{
"message": "success",
"timestamp": 1677336457,
"iss_position": {
"longitude": "29.6908",
"latitude": "-48.9932"
}
}
Para obtener el valor del nombre latitude
procederemos del siguiente modo:
❯ jq -r .iss_position.latitude samplegeekland.json
-48.9932
Finalmente si queremos que el valor latitude
no tenga más de 6 cifras:
❯ jq -r .iss_position.latitude[0:6] samplegeekland.json
-48.99
Extraer valores de matrices de un fichero JSON con jq
Si el fichero samplegeekland.json
tiene las matrices trabajosRealizados y puestosTrabajo:
{
"nombre": "Joan",
"apellido": "Geekland",
"edad": 32,
"trabajosRealizados": [
{
"empresa": "Geekland SA.",
"puestosTrabajo": [
{
"primero": "programador",
"segundo": "CEO"
}
]
},
{
"empresa": "Linux SL.",
"puestosTrabajo": [
{
"primero": "Merchandiser",
"segundo": "Mozo de Almacén"
}
]
},
{
"empresa": "Arnco.",
"puestosTrabajo": [
{
"primero": "Comercial"
}
]
},
{
"empresa": "Fruteria Geekland",
"puestosTrabajo": [
{
"primero": "Limpiador",
"segundo": "Vendedor"
}
]
}
]
}
Y queremos extraer la totalidad de empresas en las que ha trabajado el usuario joan
tendremos que ejecutar el siguiente comando:
❯ jq -r .trabajosRealizados[].empresa samplegeekland.json
Geekland SA.
Linux SL.
Arnco.
Fruteria Geekland
Nota: jq permite obtener el mismo resultado que acabamos de obtener usando tuberías. De este modo hubiéramos podido utilizar el comando jq -r ".trabajosRealizados[] | .empresa" samplegeekland.json
para obtener el mismo resultado.
Extraer valores de matrices especificando índice y longitud con jq
Si queremos que solo se muestre el nombre de la primera empresa usaremos el siguiente comando:
❯ jq -r .trabajosRealizados[0].empresa samplegeekland.json
Geekland SA.
A continuación usaremos el siguiente comando para mostrar el nombre de la última empresa:
❯ jq -r .trabajosRealizados[-1].empresa samplegeekland.json
Fruteria Geekland
Si ahora queremos obtener el nombre de la penúltima empresa:
❯ jq -r .trabajosRealizados[-2].empresa samplegeekland.json
Arnco.
Ahora si queremos el nombre de las 3 empresas más recientes:
❯ jq -r .trabajosRealizados[0,1,2].empresa samplegeekland.json
Geekland SA.
Linux SL.
Arnco.
Finalmente si lo que pretendemos es obtener del segundo valor hasta el final del listado:
❯ jq -r ".trabajosRealizados[1:] | .[] | .empresa" samplegeekland.json
Linux SL.
Arnco.
Fruteria Geekland
Nota: El elemento .[]
se usa para iterar a través de todos los elementos de una matriz.
Otros ejemplos de extracción de información almacenada en matrices
Para obtener los objetos y elementos almacenados en la array puestrosTrabajo
procederemos del siguiente modo:
❯ jq -r .trabajosRealizados[].puestosTrabajo[] samplegeekland.json
{
"primero": "programador",
"segundo": "CEO"
}
{
"primero": "Merchandiser",
"segundo": "Mozo de Almacén"
}
{
"primero": "Comercial"
}
{
"primero": "Limpiador",
"segundo": "Vendedor"
}
Y ahora para que solo se muestren los valores del nombre primero
:
❯ jq -r .trabajosRealizados[].puestosTrabajo[].primero samplegeekland.json
programador
Merchandiser
Comercial
Limpiador
De la misma forma que lo hicimos con anterioridad, también podemos hacer que unicamente se muestre el último de los elementos del siguiente modo.
❯ jq -r .trabajosRealizados[-1].puestosTrabajo[].primero samplegeekland.json
Limpiador
INFORMACIÓN ADICIONAL SOBRE JQ
Si quieren profundizar más sobre el uso de jq les recomiendo que visiten el siguiente enlace.