Arrays JSON
Vamos a explicar un poco más detallado los arrays en los datos JSON. Por lo general, usamos los arrays para representar una lista de elementos indicando cuando empieza y acaban con los corchetes ‘[ ]‘.
Iteración
Un ejemplo básico:
echo '["x","y","z"]' | jq '.[]'
Veremos que usando el operador iterador de valor de objeto .[], imprimirá cada elemento de la matriz en una línea separada:
"X"
"y"
"z"
Ahora imaginemos que queremos representar una lista de frutas en un documento JSON:
{
"frutas": [
{
"nombre": "manzana",
"color": "verde",
"precio": 1.2
},
{
"nombre": "plátano",
"color": "amarillo",
"precio": 0.5
},
{
"nombre": "kiwi",
"color": " verde",
"precio": 1
}
]
}
Cada elemento de la matriz es un objeto que representa una fruta. Como el ejemplo anterior de los trabajadores podemos extraer el nombre de cada fruta de cada objeto del array:
jq '.[] | .nombre' frutas.json
Con la salida
"manzana"
"plátano"
"kiwi"
Acceso por índice
Por supuesto, como en todos los arrays y como hemos visto antes, podemos acceder a uno de los elementos de la matriz directamente pasando el índice:
jq '.[1].precio' frutas.json
Slicing
Finalmente, jq también admite el slicing de arrays, otra característica poderosa. Particularmente es útil cuando necesitamos devolver un subarreglo de un arreglo. En el ejemplo siempre se ve mejor, vamos a verlo con un array simple de números:
echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[6:9]'
Tendrá la salida de un nuevo array pero con los número del índice entre el 6 y el 9.
[
7,
8,
9
]
Redirigiendo la tubería lo podríamos guardar en un archivo:
echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[6:9]' > guardaditoqueda.json
También es posible omitir uno de los índices al usar la funcionalidad de slicing. Probad esto:
echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[:6]' | jq '.[-3:]'
Especificamos .[:6] en el primer jq, con lo que el segmento comenzará desde el principio del array hasta el índice 6. Es lo mismo que hacer .[0:6].
Ahora, en la segunda operación de slicing tenemos un argumento negativo, lo que denota en este caso que la comienza en el final del array y hacia atrás, pero del resultado del primer jq. Con lo que tendremos la siguiente salida:
[
4,
5,
6
]
Imagina las posibilidades…