Tengo una salida JSON que contiene una lista de objetos almacenados en una variable. (Puede que no esté redactando ese derecho)
[
{
"item1": "value1",
"item2": "value2",
"sub items": [
{
"subitem": "subvalue"
}
]
},
{
"item1": "value1_2",
"item2": "value2_2",
"sub items_2": [
{
"subitem_2": "subvalue_2"
}
]
}
]
Necesito todos los valores para item2 en una matriz para que un script bash se ejecute en ubuntu 14.04.1.
He encontrado muchas formas de obtener el resultado completo en una matriz, pero no solo los elementos que necesito
jq . <<< "$json"
está relacionado con shell (bash), no específico dejq
arr=( $(...) )
jq
comando, pero no analice la salida del comando en una matriz conarr=( $(...) )
(a pesar de que funciona con la entrada de muestra): no funciona según lo previsto con espacios en blanco incrustados o iniciales / finales y puede provocar un bloqueo accidental.Lo siguiente es realmente defectuoso:
En cambio, use:
...o mejor...
fuente
Gracias a Sputnick llegué a esto:
El JSON que tengo es el resultado de una API. Todo lo que necesitaba hacer era eliminar el argumento del archivo y canalizar
|
la salida de curl a jq. Funciona muy bien y ahorró algunos pasos.fuente
*
: se reemplazará con una lista de archivos en tu directorio actual.item2
valor con espacios en blanco se convertiría en más de un elemento de matriz.Como alternativa fácil, mire la
jtc
herramienta (en https://github.com/ldn-softdev/jtc ), para lograr lo mismo (como en el ejemplo de jq):explicación sobre la
-w
opción: los corchetes angulares<...>
especifican la búsqueda completa de json, el sufijol
indica que busque etiquetas en lugar de valores,+0
indica que encuentre todas las ocurrencias (en lugar de solo la primera).fuente
arr=( $(jq ...) )
respuestas, en la medida en que el contenido se divide en cadenas y se expande globalmente para llenar la matriz, lo que significa que los espacios (no solo las nuevas líneas) crean nuevos elementos, y los elementos que parecen una expresión global se reemplazan por archivos que La expresión coincide.