Cómo trabajar con JSON en la línea de comandos

Contenidos

Datos JSON

Linux no cuenta con una forma incorporada para manejar JSON correctamente, a pesar de esto, muchas API devolverán salida JSON. A continuación, se explica cómo analizar y usar datos JSON dentro de sus scripts de shell con una sencilla utilidad.

Analizando JSON con jq

jq es una utilidad que puede manejar todo lo que quiera hacer con JSON. Es muy fácil de instalar; simplemente descargue el binario y muévalo a su carpeta en su PATH, de forma general /usr/local/bin/. No tiene dependencias, por lo que es solo un binario para descargar. Además hay descargas para macOS y Windows.

Para comenzar, puede canalizar JSON a él para imprimirlo de forma bonita. Algunas API minimizarán sus respuestas para ahorrar espacio, lo que causará este terrible lío cuando curl algo en la consola:

rizo en la consola

Típelo a jq del mismo modo que:

curl https://api.example.com/ | jq

Y ahora es legible, con resaltado de sintaxis para arrancar:

Texto legible con resaltado de sintaxis

Si das jq un comando, lo usará para elegir datos fuera del JSON, del mismo modo que cómo sed opera con texto. Usaremos esto JSONPlaceholder como ejemplo de API para probar comandos. En aras de la simplicidad, dejaremos fuera el curl comando y tubería para mantener todo legible. Además puede rizar a una lima y una tubería cat para jq, si no pretendes ver el curl salida cada vez que prueba un nuevo comando.

Un período simple ‘.‘representa los datos canalizados a jq. Si simplemente desea obtener una clave del objeto, puede hacer:

jq '.status'

Además puede anidar esto; a modo de ejemplo, '.data.geo.host' devolvería un valor más abajo en el listado. Opcionalmente, puede agregar un signo de interrogación para verificar errores como «.data.geo?.host“, Que especifica que la propiedad es opcional.

Trabajar con matrices es donde jq se pone interesante. Puede usar corchetes para obtener un elemento de matriz específico. A modo de ejemplo, puede obtener el nombre de la primera entrada con:

jq '.[0].name'

Puede cortar matrices usando [2:5]y utilice la misma sintaxis del signo de interrogación para las propiedades opcionales. Aún cuando tenga en cuenta que si una matriz está vacía, no significa que sea una propiedad no válida.

A pesar de esto, es probable que desee obtener una entrada específica en función de los datos que contiene, no en el orden de la matriz. Para hacer eso, pase toda la matriz a la select utilidad:

jq '.[] | select(.name | contains("Leanne"))'

Esto filtra la matriz para incluir solo los ítems que pasan la prueba; en esta circunstancia, ¿el name campo contiene un nombre determinado? Puede ser cualquier expresión booleana, inclusive las aritméticas como select(.count >= 2).

Reformateo de JSON

jq además puede construir JSON, lo que significa que puede usarlo para reformatear la entrada JSON. Puede hacer objetos simplemente envolviéndolos entre llaves y pasar jq declaraciones como los valores. jq generará el nuevo objeto. A modo de ejemplo:

cat json | jq '.[0] | {name: .name, company: .company}'

Salida muy bien a la línea de comando:

jq genera el nuevo objeto

Aunque esto es útil para quitar solo la información que desea, además puede construir nuevos objetos usando jq comandos.

Para obtener una referencia completa de todos jqsintaxis, puedes consulte su manual en línea.

Alternativas a jq

Si no desea usar otro programa, puede usar algunas alternativas. El método más sencillo es renunciar a hacerlo en bash y, en su lugar, usar un lenguaje de secuencias de comandos como Python o JavaScript (con nodo) para realizar el procesamiento real. En su lugar, canalizaría la salida del comando JSON a un archivo:

curl https://api/example.com/ > json.txt

Y después cárguelo en una variable dentro del script para su uso.

Además puede usar utilidades de selección de texto sencillas; a modo de ejemplo, si solo necesita una clave específica de una respuesta, puede utilizar grep junto con una expresión regular para elegir el valor:

grep "name" | sed 's/"name": "(.*)"/1/'

A pesar de esto, esto puede (y probablemente ocurrirá) muy fácilmente con cualquier cambio en el JSON. Al pasar la API de usuarios, se devolvió el nombre de cada usuario, pero además el nombre de usuario (que además coincidía con grep), así como el nombre de la compañía (que tenía exactamente la misma clave). A menos que planee prestar atención todo esto, debe utilizar algo que sea consciente de la estructura de JSON, en lugar de tratarlo como texto.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.