jq: ein sed für JSON

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 Key itemContents 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 Key item 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:

Mit jqplay kann man qj sehr gut ausprobieren und lernen.

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"
      }
    }
  ]
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert