Umgang mit JSON-Abfragesprachen, Teil 1 JavaScript Object Notation mit JSONPath filtern

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Fast jeder REST-Aufruf an eine Ressource in Azure, AWS oder Google wird mit JSON-Dokument beantwortet. Aber wie filtert man die darin enthaltene Datenfülle, um den Überblick zu behalten?

Firma zum Thema

Der JSONPath Online Evaluator.
Der JSONPath Online Evaluator.
(Bild: JSONPath.com / Stefan Gössner)

JSON ist mit seiner einfachen Struktur und der Verwendung von Unicode das ideale textbasierte Format für den Datenaustausch zwischen Systemen – und zwar unabhängig von Betriebssystem, Rechnerarchitektur oder Programmiersprache. Daten werden im JSON Format gespeichert und als Datenpaket über nahezu beliebige Verfahren an ein Zielsystem übertragen wie z. B. via Datei, HTTP, TCP/IP, Datenbank, etc.

Das Zielsystem kann die übermittelten Daten Dank der Struktur und der integrierten beschreibenden Elemente dann sehr einfach auswerten. Da die Daten als abgeschlossenes Paket/Dokument ausgetauscht werden, eignet sich JSON sehr gut für asynchrone Prozesse. Am häufigsten verbreitet ist JSON im Kontext von Web-Umgebungen, etabliert sich aber immer mehr in verschiedenen Anwendungsbereichen.

JSON Use Cases

JSON hat Anfang der Zweitausender insbesondere im Kontext der Client-Server-Kommunikation und von Webanwendungen das XML-Format (als Teil von AJAX) in kürzester Zeit verdrängt. XML hatte sich im Browser als viel zu kompliziert erwiesen und die gängigen Browser mit Ausnahme des Internet Explorer boten auch keinen XML-Support.

Neben der Kommunikation zwischen Browser und Server etablierte sich JSON in den vergangenen Jahren vor allem im Umfeld von DevOps bzw. Infrastructure as Code. Zudem spielt JSON eine zentrale Rolle im NoSQL-Datenbankbereich und kommt im Cloud Computing unter anderem als ein wichtiger Standard zur Kommunikation mit APIs vor.

Eine RESTful-HTTP-Schnittstelle (kurz REST-API) – wie z. B. die von Azure Blob Storage oder Amazon S3 – kann man z. B. einfach dadurch ansprechen, dass man z. B. JSON-Strukturen mit curl als einfache HTTP-Anfrage an das API sendet. Zudem werden in Azure, AWS und Google vor allem auch Richtlinien-Dokumente in JSON ausgedrückt.

JSON und die Cloud

Nahezu jeder REST-Aufruf, den man an eine Ressource in Azure, AWS oder Google richtet, wird mit einem mehr oder weniger komplexen JSON-Dokument beantwortet. Für Cloud-Architekten rückt dabei vor allem auch das Rückgabe-Querying in den Fokus. Wählt man in AWS oder Azure JSON als Ausgabeformat, wird stets ein wohlformatiertes, eingerücktes JSON zurückgeliefert.

Ein Problem ist dabei, dass selbst bei kleinen Deployments oft seitenlange JSON-Dokumente als Dump ausgeworfen werden, in denen man herumscrollen muss, um bestimmte Informationen zu finden. Möchte man aber nur ganz bestimmte Daten anzeigen, braucht man eine Möglichkeit, die Ausgabe des Befehls zu filtern.

So besitzen z. B die CLI-Tools von Azure und AWS die Option „--query“ mit der dahinterstehenden Bibliothek für die JSON-Abfragesprache . Dies bietet eine Fülle von Möglichkeiten, um von „az…“ oder „aws..“ zurückgegebene JSON-Dokumente direkt bei der Ausgabe auszuwerten.

Die typische JSON-Ausgabe bei Abruf einer Liste sämtlicher VMs eines Kontos. Natürlich könnte man den Scope auf Management-Gruppe, Abonnement oder Ressourcen-Gruppe beschränken.
Die typische JSON-Ausgabe bei Abruf einer Liste sämtlicher VMs eines Kontos. Natürlich könnte man den Scope auf Management-Gruppe, Abonnement oder Ressourcen-Gruppe beschränken.
(Bild: Drilling)

Angenommen man fragt z. B. in Azure mit …

az vm list

… alle vorhandenen virtuellen Maschinen im verbundenen Azure-AD-Konto ab, erhält man ein ellenlanges JSON-Listing wie in der vorangestellten Abbildung. Gezielte Informationen bekommt man hier also nur durch effizienten Einsatz der --query-Option.

Zusätzlich lassen sich aber auch andere JSON-Abfragesprachen einsetzen, etwa das deutlich mächtigere jq oder das von Stefan Gössner entwickelte, recht einfach einsetzbare JSONPath. Dieser und die folgenden Beiträge demonstrieren den Umgang mit JMESPATH, jq und JSONPath, beginnend mit letzterem.

JSONPath

Die Abfragesprache ist vor allem einfach und übersichtlich. Die komplette JSONPath-Dokumentation passt auf eine Webseite, die seit eh und je von Stefan Gössner (Professor für Mechanik an der Fachhochschule Dortmund) selbst gehostet wird. Hier kann man das Tool auch herunterladen.

Der JSONPath Online Evaluator.
Der JSONPath Online Evaluator.
(Bild: Drilling / jsonpath.com)

Im Netz gibt es aber auch einen nützlichen JSONPath Online Evaluator. Wir haben uns exemplarisch mit der typischen Ausgabe der Auflistung aller VMs eines Azure bewaffnet (az vm list) und die resultierende JSON-Ausgabe für die folgende Experimente in den Online Evaluator hochgeladen.

So selektiert z. B die Eingabe von „$“ das komplette umschließende Dokument. Möchte man nun nur das erste Element der Liste mehrerer virtueller Maschinen sehen, verwendet man z. B.:

$[0]

Interessiert nur eine bestimme Eigenschaft, gibt man diese mit „.<property> an, also:

$[0].name

Abfrage für ein geschachteltes Objekt.
Abfrage für ein geschachteltes Objekt.
(Bild: Drilling / jsonpath.com)

Möchte man mehrere Properties, hängt man diese per Komma an:

$[0].name,location

Sucht man das erste und vierte Element mit den genannten Eigenschaften, hilft:

$[0,3].name,location

Sucht man eine bestimmte Eigenschaft bei einem geschachtelten Objekt, hängt man die geschachtelte Property hinter dem Punkt an:

$[0,3].networkProfile.networkInterfaces

Gefilterte Abfrage mit JSONPath.
Gefilterte Abfrage mit JSONPath.
(Bild: Drilling / jsonpath.com)

Natürlich lassen sich beim Filtern auch Wildcards einsetzen. So liefert z. B. ein …

$[*].name

… die Namen aller virtuellen Maschinen der Liste.

Die gleiche Ausgabe kann man natürlich auch komplizierter produzieren. So erlaubt JSONPath z. B. auch den Einsatz von Filtern/Sortierern. Letztere werden durch ein Fragezeichen eingeleitet gefolgt von runden Klammern in denen dann das @-Zeichen jene Property spezifiziert, gegen die gefiltert werden soll. Der Ausdruck lautet:

$.[?(@.location)].name

Die vollständige Query-Syntax von JSONPath.
Die vollständige Query-Syntax von JSONPath.
(Bild: Drilling / Stefan Gössner, goessner.net)

Die vollständige Syntax passt in eine einzige Abbildung, sie findet sich im JSONPath-Artikel von Stefan Gössner. Im nächsten Teil werfen wie einen ausführlichen Blick auf jq.

(ID:47326794)

Über den Autor

Dipl. -Ing. Thomas Drilling

Dipl. -Ing. Thomas Drilling

IT-Consultant, Trainer, Freier Journalist