Ich habe eine JSON-Ausgabe, die eine Liste von Objekten enthält, die in einer Variablen gespeichert sind. (Ich kann das nicht richtig formulieren)
[
{
"item1": "value1",
"item2": "value2",
"sub items": [
{
"subitem": "subvalue"
}
]
},
{
"item1": "value1_2",
"item2": "value2_2",
"sub items_2": [
{
"subitem_2": "subvalue_2"
}
]
}
]
Ich benötige alle Werte für item2 in einem Array, damit ein Bash-Skript unter Ubuntu 14.04.1 ausgeführt werden kann.
Ich habe eine Reihe von Möglichkeiten gefunden, um das gesamte Ergebnis in ein Array zu integrieren, aber nicht nur die Elemente, die ich benötige
jq . <<< "$json"
Es ist Shell (Bash) bezogen, nicht spezifisch fürjq
arr=( $(...) )
jq
Befehl, aber bitte analysieren Sie die Befehlsausgabe nicht in ein Array mitarr=( $(...) )
(obwohl dies zufällig mit der Beispieleingabe funktioniert): Es funktioniert nicht wie beabsichtigt mit eingebetteten oder führenden / nachfolgenden Leerzeichen und kann zu versehentlichem Globbing führen.Folgendes ist eigentlich fehlerhaft:
Verwenden Sie stattdessen:
... oder noch besser ...
quelle
Dank Sputnick bin ich dazu gekommen:
Der JSON, den ich habe, ist die Ausgabe einer API. Alles, was ich tun musste, war, das Dateiargument zu entfernen und
|
die Ausgabe von curl an jq weiterzuleiten. Funktioniert super und hat einige Schritte gespart.quelle
*
- es wird durch eine Liste von Dateien in Ihrem aktuellen Verzeichnis ersetzt.item2
Wert mit Leerzeichen mehr als ein Array-Element werden.Schauen Sie sich als einfache Alternative das
jtc
Tool (unter https://github.com/ldn-softdev/jtc ) an, um dasselbe zu erreichen (wie im Beispiel von jq):Erklärung zur
-w
Option: Winkelklammern<...>
geben die Suche im gesamten JSON an, das Suffixl
weist an, Beschriftungen anstelle von Werten+0
zu suchen , und weist an, alle Vorkommen zu finden (und nicht nur das erste).quelle
arr=( $(jq ...) )
Antworten, sofern der Inhalt zum Auffüllen des Arrays durch Zeichenfolgen geteilt und glob erweitert wird. Das bedeutet, dass Leerzeichen (nicht nur Zeilenumbrüche) neue Elemente erstellen und Elemente, die wie ein Glob-Ausdruck aussehen, durch Dateien ersetzt werden, die Ausdruck stimmt überein.