JSON Query

Fr, 26. März 2021, Ralf Hersel

JSON ist ein beliebtes Format um Daten strukturiert darzustellen und zu verarbeiten. Das Format ist wesentlich besser lesbar als XML und auch viel kürzer. Da ich beruflich ab und zu mit grossen JSON-Dateien hantieren darf, habe ich mich gefragt, ob es eine Abfragesprache dafür gibt. Jedes Mal ein Python-Skript zu schreiben, um eine simple Auswertung zu machen, ist mir zu mühsam. Unter GNU/Linux gibt es nichts was es nicht gibt, so auch eine JSON-Abfrage namens jq.

Das Programm jq ist in den Standard-Repositories enthalten und mit apt install jq schnell installiert. Aus den Repos der Nicht-Debian-basierten Distributionen, ist es genauso einfach zu installieren. Um die Abfrage zu demonstrieren habe ich eine einfache Beispieldatei erstellt.

JSON besteht immer aus einer Schachtelung von Dictionaries '{key:value}' und Listen [a, b, c]. In der Beispieldatei sehen wir ein Dictionary mit einer Person (Vater) und darunter einer Liste (Array) mit Kindern. Die Kinder sind in einer Liste von Dictionaries abgebildet:

{
  "name": "Georg",
  "alter": 47,
  "verheiratet": false,
  "beruf": null,
  "kinder": [
    {
      "name": "Lukas",
      "alter": 19,
      "schulabschluss": "Gymnasium"
    },
    {
      "name": "Lisa",
      "alter": 14,
      "schulabschluss": null
    },
    {
      "name": "Marie",
      "alter": 18,
      "schulabschluss": "Realschule"
    }
  ]
}

Der Aufruf von jq . beispiel.json im Terminal führt zu der Ausgabe der gesamten Datei, so wie sie oben zu sehen ist. Möchte man den Namen des Vaters ausgeben, geschieht das so:

jq '.name' beispiel.json

"Georg"

Die Liste der Kinder erhält man folgendermassen:

jq '.kinder' beispiel.json

[
  {
    "name": "Lukas",
    "alter": 19,
    "schulabschluss": "Gymnasium"
  },
  {
    "name": "Lisa",
    "alter": 14,
    "schulabschluss": null
  },
  {
    "name": "Marie",
    "alter": 18,
    "schulabschluss": "Realschule"
  }
]

Möchte man nur die Namen der drei Kinder ausgeben, muss man das Array '[ ]' explizit angeben:

jq '.kinder[].name' beispiel.json

"Lukas"
"Lisa"
"Marie"

Es gibt eine Vielzahl an Funktionen, die man auf die Daten anwenden kann. Das Alter des ältesten Kindes ermittelt man so:

jq '[.kinder[].alter] | max' beispiel.json

19

Wie man sieht, wird hier ein Array an die Funktion max gepiped. Ohne das umschliessende Array funktioniert es nicht, weil dann nur drei Strings an max übergeben würden. Max möchte jedoch ein Array haben.

Als letztes Beispiel möchte ich die Liste der Kinder ermitteln, die älter als 15 Jahre sind:

jq '.kinder[] | select(.alter>=15)' beispiel.json

{
  "name": "Lukas",
  "alter": 19,
  "schulabschluss": "Gymnasium"
}
{
  "name": "Marie",
  "alter": 18,
  "schulabschluss": "Realschule"
}

Hierbei wird das Array der Kinder an die Funktion select übergeben, worin dann das Alter auf >= 15 geprüft wird.

Diese einfachen Beispiele lassen einen die Mächtigkeit des Tools jq erahnen. Tatsächlich bietet jq noch viel mehr, als hier gezeigt wurde. Unter der Quelle findet man weitere Beispiele und weiterführende Links.

Quelle: https://www.baeldung.com/linux/jq-command-json

Es wurden noch keine Kommentare verfasst, sei der erste!