jq ist ein sehr nützliches Tool, um JSON-Dateien (bzw. z.B. JSON-Ausgaben) auf einfache Weise zu bearbeiten, filtern oder transformieren. Ich habe es schonmal erwähnt.
Installiert wird es „normal“ via brew install jq
(Mac) bzw apt-get install jq
(Linux).
Hier ein hübsches Beispiel aus der Praxis zur Demonstration:
cat my.js | jq '
.itemContents[]
| select(.item.status == "ERROR" and .item.type == "document")
| .item.itemId + " " + .item.title
'
Dieses jq-Kommando besteht aus mehrere Teilen (Schritten):
.itemContents[]
holt aus dem JSON-Objekt oberster Ebene den KeyitemContents
heraus und dann alle Elemente des darin enthaltenen Arrays.| select(.item.status == "ERROR" and .item.type == "document")
wird (ähnlich Unix-Pipes) auf das Ergebnis des vorherigen Schritts angewendet und sucht (select) alle Objekte heraus, die im Keyitem
enthaltenen Objekt wiederum ein Objekt haben, wo ein Key „status“ mit dem Wert „ERROR“ und ein key „type“ mit dem wert „document“ enthalten ist.| .item.itemId + " " + .item.title'
: Von den gefundenen Objekte werden jeweils die Werte.item.itemId
und.item.title
durch ein Leerzeichen getrennt ausgegeben.
Der Ergebnis sieht dann (bei unten stehendem – gekürztem – Input) z.B. so aus:
"01912576-dbaa-4c80-8f0a-bae3e3eb2cae ccc"
Finde ich extrem elegant. Das gleiche in Java oder auch node.js braucht wesentlich mehr Code und Zeit.
Hier gibt es ein jq-Tuorial.
Besonders cool und hilfreich ist https://jqplay.org/. Dort kann man ein JSON hochladen (reinkopieren) und dann den Filter eintippen: Bei jedem Tastendruck wird das sofort ausgeführt und man sieht, ob das funktioniert. So kann man sehr schnell herausfinden, was wie funktioniert:
Anhang: Beispiel-Input „my.js“
{
"itemContents": [
{
"item": {
"itemId": "00b76804-72d5-4f4e-96c6-733d2fb50841",
"status": "OK",
"type": "document",
"validUntil": "2020-04-03T00:00:00-04:00",
"title": "aaa"
},
"attachments": [
{
}
]
},
{
"item": {
"itemId": "01912576-dbaa-4c80-8f0a-bae3e3eb2cae",
"status": "OK",
"type": "document",
"validFrom": "2017-06-13T21:38:00-04:00",
"title": "bbb"
}
},
{
"item": {
"itemId": "01912576-dbaa-4c80-8f0a-bae3e3eb2cae",
"status": "ERROR",
"type": "document",
"validFrom": "2017-06-13T21:38:00-04:00",
"title": "ccc"
}
}
]
}