Was ist JSONPath?
JSONPath ist eine Abfragesprache für JSON-Dokumente — das JSON-Äquivalent von XPath für XML. Stefan Goessner schlug sie 2007 als kurze, lesbare Methode vor, um auf einen Knoten in einem JSON-Baum zu zeigen, ohne einen Parser zu schreiben. Ein Ausdruck beginnt mit dem Wurzel-Selektor $ und verkettet Eigenschaftszugriffe, Array-Indizes, Platzhalter, rekursiven Abstieg und Filterbedingungen, bis er die gewünschten Knoten auswählt. 2024 veröffentlichte die IETF RFC 9535, um die Syntax zu standardisieren, die sich über Implementierungen fragmentiert hatte; dieser Tester läuft auf jsonpath-plus, einer weit verbreiteten JavaScript-Implementierung, die den Goessner-Entwurf, den Großteil von RFC 9535 und einige Erweiterungsoperatoren abdeckt.
Wie JSONPath funktioniert
Ein JSONPath-Ausdruck wird von links nach rechts gelesen und durchläuft ein JSON-Dokument Schritt für Schritt. Jeder Schritt nimmt die Menge der Knoten, die den vorherigen Schritt überlebt haben, und schränkt sie weiter ein. Die vollständige Auswertungs-Pipeline:
- Ankern mit dem Wurzel-Selektor
$. Jeder Ausdruck beginnt hier und zeigt auf den Wert der obersten Ebene, ob es sich um ein Objekt oder ein Array handelt. Bloße Eigenschaftsnamen ohne führendes$sind kein gültiger JSONPath. - In Kind-Member mit Punkt-Notation (
$.store.book) oder Klammer-Notation ($['store']['book']) navigieren. Klammer-Notation ist erforderlich, wenn ein Schlüssel ein Leerzeichen, einen Bindestrich oder ein Zeichen enthält, das kein gültiger Bezeichner ist. - Alle Ebenen auf einmal mit dem rekursiven Abstiegsoperator
..durchsuchen. Der Ausdruck$..authorsammelt jedenauthor-Wert überall im Baum, unabhängig von der Tiefe. Das ist der Operator, den JMESPath nicht hat. - Array-Elemente per Index auswählen (
[0],[-1]für das letzte Element in jsonpath-plus), mit[start:end]-Notation ausschneiden ([0:3]gibt die ersten drei zurück) oder alle Elemente mit dem Platzhalter[*]auswählen. - Elemente mit einem Prädikat in
[?(...)]filtern. Im Prädikat bezieht sich@auf das aktuelle Element, sodass[?(@.price<10)]nur Elemente behält, derenprice-Feld kleiner als 10 ist. Filter lassen sich mit dem Rest des Pfads kombinieren — du kannst erst filtern und dann absteigen oder erst absteigen und dann filtern. - Das Ausgabeformat wählen. Werte gibt die gefundenen Daten selbst zurück. Pfade gibt den JSONPath jedes Treffers zurück, sodass du sehen kannst, was die Engine aufgelöst hat. Zeiger gibt den entsprechenden RFC 6901-JSON-Zeiger für jeden Treffer zurück — nützlich, wenn der nachgelagerte Verbraucher JSON Patch oder ein JSON-Schema-Validator ist.
Warum diesen JSONPath-Tester verwenden?
- Dein JSON verlässt den Browser nicht. Die Abfrage läuft auf der Seite, sodass Produktions-Fixtures, Kunden-PII und vorab veröffentlichte API-Antworten auf deinem Gerät bleiben.
- Die Engine ist
jsonpath-plus9.x — dieselbe Bibliothek, die viele Produktions-Testsuiten und CI-Assertions antreibt. Die hier gesehenen Ergebnisse stimmen mit den Ergebnissen deiner Build-Pipeline überein. - Drei Ausgabemodi decken die gängigen nachgelagerten Verbraucher ab: rohe Werte zum Kopieren, Pfade zum Debuggen der Engine-Auflösung und RFC-6901-Zeiger für JSON-Patch- und JSON-Schema-Workflows.
- Filterausdrücke laufen mit
preventEval: true, sodass eine eingefügte Abfrage kein beliebiges JavaScript gegen die Host-Seite ausführen kann. Das ist wichtig, wenn der Ausdruck aus einer Slack-Nachricht, einem Jira-Ticket oder der Zwischenablage eines Kollegen stammt.
Häufige Anwendungen von JSONPath
JSONPath taucht überall dort auf, wo Code ein Feld aus einer JSON-Payload herausziehen muss, ohne einen rekursiven Abstieg von Hand zu schreiben:
- Postman-Tests: der Tests-Tab in Postman stellt
pm.response.json()zusammen mit JSONPath-Zugriff für Assertions zur Verfügung. Teams schreiben einen einzigen Ausdruck wie$.data.user.email, um ein Feld aus einer Antwort zu ziehen und es in CI zu überprüfen. - k6-Lasttests: k6-Skripte rufen
jsonpath()in einemcheck()-Block auf, um Werte aus Antwortkörpern zu extrahieren und SLA-Schwellenwerte zu überprüfen. Derselbe Ausdruck, der einen Vertrag in Postman bewiesen hat, kann einen Lasttest unter k6 steuern. - JSON-DSL für Datentransformationen: AWS Step Functions wertet JSONPath innerhalb von
InputPath,ResultPathundParametersaus, um Event-Payloads zwischen Zuständen umzuformen. Argo Workflows verwendet JSONPath inwithParam, um Tasks über ein Array aufzufächern. Kuberneteskubectl -o jsonpathverwendet dieselbe Syntax, um Felder aus Cluster-Objekten zu extrahieren.
Praktisches Beispiel
Das kanonische Goessner-Fixture ist das Buchhandlungs-Dokument mit vier Büchern, die jeweils category, author, title und price tragen. Gegen dieses Fixture läuft der Ausdruck $.store.book[?(@.price<10)].title in drei Schritten. Zuerst löst $.store.book das Array aller vier Bücher auf. Dann behält der Filter [?(@.price<10)] nur das eine Buch mit einem Preis unter 10 (den Eintrag zu 8,95). Schließlich extrahiert .title den Titel dieses Buches. Das Ergebnis ist ["Sayings of the Century"]. Wechseln zu Pfade gibt ["$['store']['book'][0]['title']"] zurück, und Zeiger gibt ["/store/book/0/title"] zurück.
Ausdrücke hier entwickeln und dann direkt in Postman, k6, kubectl oder eine Step-Functions-Zustandsmaschine übertragen. Einfügen, abfragen, kopieren. Nichts überquert das Netzwerk.
Was ist JSONPath?
JSONPath ist eine Abfragesprache für JSON-Dokumente, analog zu XPath für XML. Von Stefan Goessner 2007 vorgeschlagen und von der IETF 2024 als RFC 9535 standardisiert, verwendet sie eine kompakte Ausdruckssyntax, die mit $ (dem Dokumentwurzel) beginnt und Punkt-Notation, Array-Indizes, Platzhalter, Ausschnitte, rekursiven Abstieg (..) und Filterausdrücke ([?(...)]) unterstützt, um Knoten in einem JSON-Baum auszuwählen.
Wie unterscheidet sich JSONPath von JMESPath oder jq?
Alle drei fragen JSON ab, aber ihre Grammatiken und Ziele unterscheiden sich. JMESPath ist der AWS-CLI/SDK-Standard: strenger als JSONPath, kein rekursiver Abstieg, ausgelegt auf vorhersehbare seiteneffektfreie Projektion. jq ist eine Turing-vollständige Skriptsprache, die JSON nicht nur abfragt, sondern auch transformiert, reduziert und streamt. JSONPath liegt dazwischen: ausdrucksstärker als JMESPath dank rekursivem Abstieg und Filtern, leichter als jq, und die am weitesten verbreitete Syntax in allgemein verwendetem Test-Tooling (Postman, Playwright, REST Assured, kubectl, Step Functions). Dieser Tester implementiert JSONPath.
Welchen Dialekt verwendet dieser Tester?
Dieser Tester läuft auf jsonpath-plus 9.x. Diese Bibliothek implementiert die Goessner-2007-Spezifikation, deckt den Großteil von RFC 9535 ab und fügt Erweiterungsoperatoren wie Typprüfungen (@.string(), @.number(), @.boolean()) und übergeordnete Navigation (^) hinzu. Das Flag preventEval: true ist immer gesetzt, sodass Filterprädikatate durch einen sicheren Interpreter und nicht durch das JavaScript-eval()-Builtin laufen. Eine eingefügte Abfrage kann keinen beliebigen Code gegen diese Seite ausführen.
Kann ich einzelne gefundene Werte kopieren?
Ja. Der In die Zwischenablage kopieren-Button kopiert den vollständigen Ergebnisblock als JSON-Array. Um einen einzelnen Wert zu greifen, schalte den Ausgabemodus auf Werte, wähle dann die gewünschte Zeile im Ergebnis-Textfeld aus und verwende den normalen Browser-Kopierkurzbefehl (Strg/Cmd + C). Die Ausgabe ist reiner JSON-Text und lässt sich sauber in einen Code-Editor, ein Terminal, einen Postman-Test oder eine Slack-Nachricht einfügen.