Transforma JSON y hazlo legible con jq

La notación de objetos JavaScript (JSON) es uno de los formatos de datos más populares del mundo. Tiene un amplio soporte y una simple especificación. Es fácil trabajar con muchos lenguajes de programación, especialmente aquellos destinados al desarrollo web.

Pero la inspección manual de datos JSON sigue siendo incómoda. Aunque es un formato de texto legible por humanos, un conjunto de datos JSON puede contener grandes cantidades de datos. Las fuentes no siempre formatean JSON en una forma fácil de leer.

java La herramienta jq permite a los usuarios formatear, filtrar y transformar datos JSON.

¿Qué es jq?

Dado que es una herramienta de línea de comandos, generalmente usará jq escribiendo comandos en una terminal. También hay un excelente parque infantil en línea disponible, que cubrimos con más detalle a continuación.

El funcionamiento normal gira en torno a los filtros y la aplicación de un filtro a algunos JSON de entrada. Puede usar jq para buscar un solo elemento de un conjunto de muchos. O puede eliminar ciertos campos de cada elemento de un conjunto, simplificando los datos. Incluso puede realizar operaciones complejas para traducir la entrada a una forma diferente.

Cómo descargar e instalar jq

El programa jq no tiene dependencias externas, lo que significa que es muy fácil comenzar. Comience descargando un binario ejecutable para Linux, macOS o Windows a través del botón en la página de inicio de jq . Una vez que haya descargado el programa, puede ejecutarlo directamente desde la línea de comandos. Es posible que desee cambiarle el nombre ( mv jq-osx-amd64 jq ) por conveniencia, y es posible que deba hacerlo ejecutable ( chmod + x jq ).

Confirme que puede ejecutar jq ejecutándolo desde la línea de comando sin argumentos:

 $ ./jq

Debería ver información de uso general, comenzando con un resumen simple de una línea como el siguiente:

 jq - commandline JSON processor [version 1.6]

Si tiene dificultades con el enfoque anterior, existen alternativas. El software jq tiene soporte para administradores de paquetes comunes, y mientras tanto, siempre puede experimentar con el sandbox en línea.

Uso básico de jq

El uso estándar es:

 jq [options] <jq filter> [file...]

Así por ejemplo:

 $ jq '.' data.json

También puede canalizar la entrada a través de otro comando como este:

 $ echo '{"name":"john"}' | jq '.'
{
"name": "john"
}

Esto es más útil cuando, por ejemplo, el primer comando es algo así como una llamada a curl que puede obtener datos JSON de un servicio web.

El filtro se muestra en estos ejemplos es el más simple posible,. (un punto) , que imprime la entrada en forma embellecida. Esto ya es bastante útil, pero los filtros de jq proporcionan mucha más potencia que esto.

Cómo aplicar filtros básicos a JSON usando jq

Un filtro jq es un poco como un selector CSS o una expresión XPATH. Es una expresión larga que consta de partes más pequeñas. Un filtro completo puede parecer complicado, pero una vez que haya aprendido los conceptos básicos, cada parte debería ser comprensible.

Trabajar con objetos

Puede obtener el valor de una propiedad de objeto utilizando la sintaxis .property :

 $ echo '{"name":"john"}' | jq '.name'
"john"

Esto puede encadenar para acceder a estructuras anidadas profundas:

 $ echo '{"name":{"first":"john","last":"smith"}}' | jq '.name.last'
"smith"

Trabajar con matrices

La operación de matriz más simple devuelve un elemento a través de su índice:

 $ echo '[1,2,3]' | jq '.[2]'
3

Tenga en cuenta que, como con la mayoría de los lenguajes de programación, jq indexa matrices a partir de la posición 0. También puede dividir una submatriz con esta sintaxis:

 $ echo '[1,2,3]' | jq '.[1:3]'
[
2,
3
]

Sin un índice entre corchetes, jq transforma un único valor de matriz en su propio contenido, como múltiples valores:

 $ echo '[1,2,3]' | jq '.[]'
1
2
3

Este es un método importante para encadenar filtros, que mostraremos más adelante.

Funciones más avanzadas

Solo puede obtener una comprensión completa del poder de jq leyendo el manual de jq . De hecho, el soporte de jq para operadores, variables e incluso funciones definidas por el usuario lo hace capaz de actuar como cualquier lenguaje de programación.

Estas características hacen posible el uso avanzado, aunque complicado. Pero jq tiene algunas características integradas, como funciones y operadores, que benefician incluso las tareas más simples. He aquí un ejemplo:

 $ echo '[2,4,8]' | jq 'add / length'
4.666666666666667

Este filtro alimenta la entrada en las funciones de suma y longitud , dividiendo los resultados. En funcionamiento, calcula el promedio de una matriz de números.

El operador de división también puede actuar sobre cadenas para dividirlas en función de un separador:

 $ echo '"Just testing"' | jq '. / " "'
[
"Just",
"testing"
]

La función de selección filtra una matriz, manteniendo solo aquellos elementos que pasan una restricción determinada:

 $ echo '[2,4,8]' | jq '.[] | select(. >= 3)'
4
8

Tenga en cuenta que este también es un ejemplo del operador de tubería de jq ( | ) que es como una tubería de shell. Introduce el resultado de su filtro de la izquierda como entrada a su filtro de la derecha.

La función de mapa es muy útil cuando se trabaja con matrices. Realiza una operación en cada elemento de la matriz en lugar de la matriz completa en sí:

 $ echo '[1,2,3]' | jq 'map(.+1)'
[
2,
3,
4
]

A menudo lo usará junto con select, p. Ej.

 $ echo '[2,4,8]' | jq 'map(select(. >= 3))'
[
4,
8
]

Poniéndolo todo junto: un ejemplo práctico de jq

Dado que jq procesa cualquier JSON válido que se le envíe, puede enviarlo desde el comando curl . Esto le permite obtener JSON de una URL y procesarlo inmediatamente en la línea de comandos:

JSON Feed es una alternativa JSON a los formatos RSS y Atom. El sitio de NPR es un ejemplo que admite JSON Feed, pero es difícil de ver desde la fuente y contiene muchos datos:

De inmediato, puede ver cuánto más fácil es leer al obtener estos datos y canalizarlos a través de jq:

 $ curl -s https://feeds.npr.org/1019/feed.json | jq '.'

Aquí hay un ejemplo más completo de un filtro que obtiene la identificación, el título y la fecha de cada historia que el sitio publicó un martes.

 $ curl -s https://feeds.npr.org/1019/feed.json |
jq '.items | .[] |
select(
.date_published |
.[0:19] + "Z" |
fromdate |
strftime("%a") == "Tue"
) |
{id: .id, title:.title, date:.date_published}'

Después de seleccionar la propiedad de los elementos , este filtro utiliza . [] Para iterar sobre cada elemento. La mayor parte del filtro usa la función de selección para mantener solo aquellas publicaciones con un valor date_published cuyo día de la semana ( strftime ("% a") ) es martes . La función strftime requiere una fecha formateada muy específicamente que el filtro . [0:19] + "Z" construye.

Después de seleccionar los elementos deseados, el filtro final crea un objeto para cada uno con los campos obligatorios. Tenga en cuenta que cada vez que cambie el feed, los resultados serán diferentes. Aquí hay un ejemplo tomado en el momento de la publicación:

 {
"id": "959667930",
"title": "Deplatforming: Not A First Amendment Issue, But Still A Tough Call For Big Tech",
"date": "2021-01-26T17:00:00-05:00"
}
{
"id": "960679189",
"title": "My Pillow CEO Mike Lindell Permanently Suspended From Twitter",
"date": "2021-01-26T10:17:15-05:00"
}
{
"id": "960220477",
"title": "Is Your 401(k) Colluding To Make Cereal More Expensive?",
"date": "2021-01-26T06:31:24-05:00"
}

Véase también: Análisis de JSON Python: una guía sencilla

Cómo procesar JSON en línea usando jqplay

Si desea probar jq antes de descargarlo, jqplay es el lugar perfecto para comenzar. A través de una interfaz simple, el sitio le permite ingresar JSON de muestra y un filtro, luego ver el resultado.

También le permite probar algunas opciones diferentes. Estos incluyen –compact-output (para eliminar los espacios en blanco) y –null-input (para mostrar el resultado en la entrada que falta).

La interfaz también incluye una sección de hojas de trucos muy útil. Aquí hay una captura de pantalla del ejemplo largo anterior :

Tenga en cuenta que, al igual que con ese enlace, también puede compartir ejemplos a través de una URL.

Utilice jq para leer y manipular datos JSON

Puede encontrar información completa sobre jq en el tutorial y el manual, ambos en vivo en el sitio web de jq. El programa en sí ofrece una cantidad limitada de ayuda a través de la opción –help .

Si desea realizar filtros y transformaciones básicos o leer una gran parte de JSON, jq es una herramienta valiosa.