¿Qué es la impresión bonita?
Los datos JSON están estructurados para ser algo más legibles por humanos. Sin embargo, en la mayoría de los casos, los datos JSON se almacenan en una sola línea, incluso sin un carácter de final de línea.
Obviamente, eso no es muy conveniente para leer y editar manualmente.
Ahí es cuando la impresión bonita es útil. El nombre se explica por sí mismo, reformateando el texto JSON para que sea más legible para los humanos. Esto se conoce como impresión bonita JSON. .
Analice e imprima bastante JSON usando jq en Linux
Los datos JSON se pueden analizar con procesadores de texto de línea de comandos como awk , sed y gerp . De hecho, JSON.awk es un script awk para hacer eso. Sin embargo, hay algunas herramientas dedicadas para el mismo propósito.
- jq o jshon , analizador JSON para shell, ambos son bastante útiles.
- Scripts de shell como JSON.sh o jsonv.sh para analizar JSON en bash, zsh o dash shell.
- JSON.awk , secuencia de comandos awk del analizador JSON.
- Módulos de Python como json.tool .
- subrayado-cli , Node.js y basado en javascript.
En este tutorial me estoy enfocando solo en jq , que es un analizador JSON bastante poderoso para shells con capacidad avanzada de filtrado y secuencias de comandos.
Impresión bonita JSON
Los datos JSON podrían estar en uno y casi ilegibles para los humanos, por lo que para que sea legible, aquí está la impresión bonita JSON.
Ejemplo: Un dato de jsonip.com , para obtener una dirección IP externa en formato JSON, use curl o wget herramientas como las siguientes.
$ wget -cq http://jsonip.com/ -O -
Los datos reales se ven así:
{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}
Ahora imprímelo con jq:
$ wget -cq http://jsonip.com/ -O - | jq '.'
Esto debería verse como a continuación, después de filtrar el resultado con jq.
{ "ip": "111.222.333.444", "about": "/about", "Pro!": "http://getjsonip.com" }
Se podría hacer lo mismo con python json.tool módulo. Aquí hay un ejemplo:
$ cat anything.json | python -m json.tool
Esta solución basada en Python debería estar bien para la mayoría de los usuarios, pero no es tan útil cuando Python no está preinstalado o no se pudo instalar, como en los sistemas integrados.
Sin embargo, el módulo json.tool python tiene una clara ventaja, es multiplataforma. Por lo tanto, puede usarlo sin problemas en Windows, Linux o Mac OS.
Lectura sugerida:
- Prettyping:haga que la salida del comando Ping sea más bonita y fácil de leer
Cómo analizar JSON con jq
Primero, necesita instalar jq, ya está instalado en la mayoría de las distribuciones de GNU/Linux, instálelo con sus respectivos comandos de instalación de paquetes.
En Arch Linux:
$ sudo pacman -S jq
En Debian, Ubuntu, Linux Mint:
$ sudo apt-get install jq
En Fedora:
$ sudo dnf install jq
En openSUSE:
$ sudo zypper install jq
Para otros sistemas operativos o plataformas, consulte las instrucciones de instalación oficiales.
Filtros básicos e identificadores de jq
jq podría leer los datos JSON desde stdin o un archivo . Tienes que usar ambos dependiendo de la situación.
El único símbolo de . es el filtro más básico. Estos filtros también se denominan índice de identificador de objeto . Usando un solo . junto con jq básicamente imprime bastante el archivo JSON de entrada.
Comillas simples - No tienes que usar la comilla simple siempre. Pero si está combinando varios filtros en una sola línea, entonces debe usarlos.
Comillas dobles - Tienes que incluir cualquier carácter especial como @ , # , $ dentro de dos comillas dobles, como este ejemplo, jq .foo."@bar"
Impresión de datos sin procesar - Por cualquier motivo, si solo necesita los datos analizados finales, no encerrados entre comillas dobles, use el indicador -r con el comando jq, así. - jq -r .foo.bar .
Análisis de datos específicos
Para filtrar una parte específica de JSON, debe buscar en la jerarquía de datos del archivo JSON bastante impreso.
Un ejemplo de datos JSON, de Wikipedia:
{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ], "gender": { "type": "male" } }
Voy a usar estos datos JSON como ejemplo en este tutorial, lo guardé como sample.json .
Digamos que quiero filtrar la dirección del archivo sample.json. Entonces el comando debería ser como:
$ jq .address sample.json
Salida de muestra:
{ "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }
Nuevamente, digamos que quiero el código postal, luego debo agregar otro índice de identificador de objeto , es decir, otro filtro.
$ cat sample.json | jq .address.postalCode
También tenga en cuenta que los filtros distinguen entre mayúsculas y minúsculas y debe usar exactamente la misma cadena para obtener un resultado significativo en lugar de nulo.
Análisis de elementos de una matriz JSON
Los elementos de la matriz JSON están encerrados entre corchetes, sin duda bastante versátiles de usar.
Para analizar elementos de una matriz, debe usar el []identificador junto con otro índice de identificador de objetos.
En esta muestra de datos JSON, los números de teléfono se almacenan dentro de una matriz, para obtener todo el contenido de esta matriz, debe usar solo los corchetes, como este ejemplo.
$ jq .phoneNumber[] sample.json
Digamos que solo quiere el primer elemento de la matriz, luego use los números de objeto de la matriz que comienzan con 0, para el primer elemento, use [0] , para los siguientes elementos, debe incrementarse en uno en cada paso.
$ jq .phoneNumber[0] sample.json
Ejemplos de secuencias de comandos
Digamos que solo quiero el número para el hogar, no todos los datos de la matriz JSON. Aquí es cuando las secuencias de comandos dentro del comando jq resultan útiles.
$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'
Aquí, primero estoy canalizando los resultados de un archivador a otro, luego uso el atributo de selección para seleccionar un tipo particular de datos, y nuevamente canalizo el resultado a otro filtro.
Explicar cada tipo de filtros jq y secuencias de comandos está más allá del alcance y el propósito de este tutorial. Se recomienda encarecidamente leer el manual de JQ para una mejor comprensión que se proporciona a continuación.