JSONPath ist eine Abfragesprache fuer JSON wie XPath fuer XML: Sie zeigen auf Knoten statt verschachtelte Schleifen zu schreiben. An den meisten Tagen brauchen Sie nur wenige Tokens - `$`, `@`, Punkte, Klammern, `*`, `..`, einen Slice und einen einfachen `[?()]`-Filter. Dieser Guide ist genau diese kurze Liste, kein vollstaendiger RFC-Klon. Fuegen Sie das Sample unten in den JSONPath-Tester ein und testen Sie jeden Ausdruck im Browser - es wird nichts hochgeladen.
Kurze Antwort
Beginnen Sie jeden Pfad mit `$` (Dokumentwurzel). Nutzen Sie `@` in einem Filter fuer das aktuelle Element. Bevorzugen Sie `$.store.book[*].title` im Alltag; verwenden Sie `$['store']['book'][0]`, wenn der Schluessel Leerzeichen oder reservierte Zeichen hat. `$..author` findet ein Feld in jeder Tiefe. Filter sehen aus wie `$.store.book[?(@.price < 10)]`. Behandeln Sie RFC 9535 als modernen Dialekt und aeltere Goessner-Samples als Folklore, bis Sie sie geprueft haben.
Ein gemeinsames Sample-Payload
Alle Beispiele nutzen das klassische Bookstore-Dokument (dieselbe Form, die viele JSONPath-Tutorials teilen). Halten Sie es beim Lesen bereit:
- `store.book` - ein Array von Objekten mit `category`, `author`, `title`, `price` und manchmal `isbn`.
- `store.bicycle` - ein verschachteltes Objekt mit `color` und `price`.
- Wenn Ihr Payload als eine Zeile ankam, formatieren Sie ihn zuerst mit dem JSON-Minifier und -Formatter und fragen Sie dann ab.
$ und @
`$` ist die Wurzel des JSON-Werts, den Sie eingefuegt haben - das ganze Objekt oder Array. Jeder nuetzliche Ausdruck beginnt dort. `@` ist nur in einem Filter sinnvoll: es bedeutet "das aktuell gepruefte Element." Ausserhalb eines Filters ist `@` kein freier Cursor.
- `$` - die Dokumentwurzel.
- `@.price` innerhalb von `[?()]` - das Feld `price` des geprueften Elements.
- `$.store.book[?(@.isbn)]` - Buecher, die den Schluessel `isbn` haben (Existenz).
- Ein Pfad ohne `$` wird von strengen Testern oft abgelehnt - beginnen Sie immer mit `$`.
Punkt vs. Klammern
Punktnotation ist Kurzform fuer einfache Identifier: `$.store.book`. Klammernotation ist die explizite Form: `$['store']['book']`. Nutzen Sie Klammern, wenn der Schluessel kein schlichter Identifier ist (Leerzeichen, Bindestriche, fuehrende Ziffern) oder wenn Sie den normalisierten RFC-9535-Pfadstil wollen, den viele Tools in der Match-Tabelle zeigen.
- `$.store.bicycle.color` - in Ordnung fuer gewoehnliche Schluessel.
- `$['content-type']` - noetig, wenn der Schluessel kein JS-artiger Identifier ist.
- `$['store']['book'][0]['title']` - singularer normalisierter Pfad zu einem Knoten (RFC-9535-§2.7-Stil).
- Indizes stehen immer in Klammern: `$.store.book[0]`, nicht `$.store.book.0`.
* und ..
`*` ist ein Wildcard fuer "jedes Kind auf dieser Ebene." `..` ist rekursiver Abstieg: Baum durchlaufen und Matches in jeder Tiefe sammeln. Wildcards bleiben flach; Abstieg kann bei grossen Dokumenten ueberraschen.
- `$.store.book[*].title` - der Titel jedes Buchs (eine Ebene Array-Items).
- `$.store.*` - sowohl `book` als auch `bicycle` unter `store`.
- `$..author` - jeder `author` irgendwo unter der Wurzel.
- `$..price` - Buchpreise und der Bicycle-Preis zusammen - engen Sie den Pfad ein, wenn Sie nur eines wollten.
Slices
Array-Slices nutzen python-artiges `start:end:step` in Klammern. Fehlende Enden bedeuten "vom Anfang" oder "bis zum Ende." Negative Indizes zaehlen vom Ende, wenn die Implementierung sie unterstuetzt.
- `$.store.book[0:2]` - die ersten beiden Buecher (Indizes 0 und 1).
- `$.store.book[-1:]` - das letzte Buch, auf Engines mit negativen Indizes.
- `$.store.book[::2]` - jedes zweite Buch, wenn Step unterstuetzt wird.
- Slices waehlen Array-Items; haengen Sie danach ein Feld an: `$.store.book[0:2].title`.
Ein einfacher Filter
Filter stehen in `[?(...)]` und behalten Items, bei denen der Ausdruck wahr ist. `@` ist das aktuelle Element. Vergleiche coercen Typen meist nicht wie lockeres JavaScript - `1 == "1"` ist oft falsch. Halten Sie Filter langweilig: Gleichheit, Ungleichheit, numerischer Vergleich, `&&`, `||`, `!` und Existenz.
- `$.store.book[?(@.price < 10)]` - guenstige Buecher.
- `$.store.book[?(@.price < 10 && @.category == 'fiction')].title` - filtern, dann ein Feld extrahieren.
- `$.store.book[?(@.isbn)]` - Items mit `isbn`.
- Setzen Sie den Filter auf das Array, das Sie scannen - nicht auf eine Objekt-Wurzel allein, es sei denn die Wurzel ist ein Array.
RFC 9535 vs. aelteres Goessner-Dialekt
Stefan Goessners Artikel von 2007 hat JSONPath popularisiert und viele Libraries kopieren noch seine Beispiele. RFC 9535 (2024) ist der IETF-Standard: klarere Grammatik, normalisierte Pfade und weniger "eval irgendwas"-Schlupfloecher. Script-Selektoren wie `[(@.length-1)]` und freies JavaScript in Filtern gehoeren zum Wilden Westen, nicht zu einem sicheren Browser-Tester.
- RFC 9535 - standardisierte Operatoren, normalisierte Pfade wie `$['store']['book'][0]`, fuer interoperable Implementierungen.
- Goessner-era Samples - immer noch ueberall in Blogs; pruefen Sie sie vor dem Produktionseinsatz.
- No-eval-Subsets - was Sie fuer eingefuegte API-Payloads wollen. Script-Selektoren ablehnen; den Pfad nie als JavaScript ausfuehren.
- Wenn zwei Tools widersprechen, pruefen Sie, welchen Dialekt sie beanspruchen - nicht welcher sich "richtig anfuehlt".
Keine vollstaendige Spec
Dieser Artikel ist ein Spickzettel fuer taegliche Ausdruecke. Fuer normative Details lesen Sie RFC 9535. Fuer private Versuche gegen Ihr eigenes JSON nutzen Sie den JSONPath-Tester.
Fuenf Copy-Paste-Beispiele
Am Bookstore-Sample diese der Reihe nach ausprobieren:
- `$.store.book[*].title` - alle Titel als Liste.
- `$..author` - jeder Autor per rekursivem Abstieg.
- `$.store.book[0:2]` - die ersten beiden Buch-Objekte.
- `$.store.book[?(@.price < 10)]` - Buecher mit Preis unter 10.
- `$.store.book[?(@.price < 10)].title` - derselbe Filter, nur Titel.
Nachdem Sie eine flache Liste von Records extrahiert haben, wollen Sie vielleicht eine Tabellenansicht - schicken Sie ein JSON-Array von Objekten durch den JSON-zu-CSV-Konverter. Bei verschachtelten API-Blobs, die Sie noch erkunden, bleiben Sie bei JSONPath, bis die Form klar ist.
Haeufig gestellte Fragen
Beginnt jeder JSONPath mit $?
Ja in der Praxis. `$` benennt die Wurzel. Strenge Tools lehnen Pfade ohne `$` ab.
Wann verwende ich @?
Nur in `[?()]`-Filtern als aktuelles Element. Es ersetzt `$` am Pfadbeginn nicht.
Warum null Matches?
Ein gueltiger Pfad kann nichts treffen. Haeufig: Objekt-Wurzel statt Array filtern, Tippfehler im Schluessel, oder JavaScript-Typ-Coercion erwarten. Versuchen Sie `$..field`, um zu bestaetigen, dass das Feld existiert, und engen Sie dann ein.
Ist JSONPath dasselbe wie JMESPath oder jq?
Nein. Verwandte Idee, andere Syntax und Libraries. Waehlen Sie einen Dialekt pro Codebase und bleiben Sie dabei.
Kann ich eine private API-Antwort sicher testen?
Ja, wenn der Evaluator im Browser ohne Upload laeuft. Der JSONPath-Tester ist dafuer gebaut - einfuegen, abfragen, extrahiertes JSON oder normalisierte Pfade kopieren.
Auf ToolsMinify ausprobieren
Alle Tools unten laufen im Browser - kostenlos, ohne Konto, ohne Upload:
- JSONPath-Tester - JSON einfuegen, Ausdruck ausfuehren, Matches oder extrahierte Werte kopieren.
- JSON-Minifier und -Formatter - Payload vor der Abfrage formatieren oder minifyen.
- JSON-zu-CSV-Konverter - flaches JSON-Array von Objekten nach dem Extrahieren in CSV umwandeln.
- Alle Entwickler-Tools - der vollstaendige Kategorie-Index.
Kostenlos ausprobieren
Oeffnen Sie den JSONPath-Tester, laden Sie das Bookstore-Sample und fuegen Sie `$.store.book[?(@.price < 10)].title` ein. Sie sollten die guenstigen Titel sehen - alles auf Ihrem Geraet.