JSON Query

  Ralf Hersel   Lesezeit: 4 Minuten

Abfragen auf JSON-Dateien mit dem Tool JQ

json query

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 gelegentlich 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.

Nachtrag

Zweieinhalb Jahre später habe ich einen zweiten Teil zu diesem Artikel geschrieben.

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

Tags

JSON, Array, Kinder, Liste, JSON-Dateien, Kind, Beispieldatei

Es wurden noch keine Kommentare verfasst, sei der erste!