Skip to content

Kostenloser JSONPath-Tester online

Teste JSONPath-Ausdrücke sofort gegen beliebiges JSON. RFC-9535-Engine plus klassischer Goessner-Modus, Ansichten Werte / Pfade / Beide, normalisierte Pfade, kein eval. 100 % privat, läuft im Browser, kein Upload, keine Anmeldung.

Kein Tracking Läuft im Browser Kostenlos
Jede Auswertung läuft lokal in deinem Browser. Dein JSON und dein Ausdruck verlassen nie dieses Gerät. Kein eval, kein Upload.
Engine
 
JSONPath-Spickzettel
$Wurzelelement
@Aktuelles Element (in Filtern)
.nameKindmitglied
..nameRekursiver Abstieg
[*]Alle Elemente / Mitglieder
[0]Array-Index
[0:2]Array-Slice [start:end:step]
[a,b]Vereinigung von Namen / Indizes
[?(@.k>1)]Filterausdruck
length()RFC-9535-Funktion: length / count / match / search / value
Geprüft auf RFC-9535-Grammatiktreue, Korrektheit der normalisierten Pfade, semantische Dual-Engine-Parität bei gängigen Pfaden und dokumentierte Divergenz in den Randfällen, No-eval-Sicherheit (Schließen von CVE-2024-21534 und CVE-2025-1302) sowie Barrierefreiheit (ARIA-Rollen, Radiogroup-Engine-Umschalter, Screenreader-Ergebnisansagen, LTR-JSON-Handhabung unter RTL-Layouts). — Go Tools Data Tooling Team · Jun 13, 2026

Was ist ein JSONPath-Tester?

Ein JSONPath-Tester ist ein Tool, mit dem du einen JSONPath-Ausdruck schreiben, ein JSON-Dokument einfügen und genau sehen kannst, welche Knoten der Ausdruck auswählt — sowohl die übereinstimmenden Werte als auch ihre genauen Orte — ohne Code zu schreiben oder ein Skript auszuführen. Für Entwickler verkürzt es die Schleife von Minuten auf Millisekunden: Optimiere den Pfad, beobachte, wie sich das Ergebnis ändert, und liefere die Abfrage mit Zuversicht aus.

JSONPath ist eine Abfragesprache für JSON, das JSON-Analogon zu XPath für XML. Ein Ausdruck baut sich aus einem kleinen Alphabet von Selektoren auf. $ ist die Wurzel des Dokuments. Ein Punkt oder eine Klammer steigt in ein Kind hinab: $.store oder $['store']. Der doppelte Punkt .. ist rekursiver Abstieg — er durchsucht jede Ebene des Baums. Der Platzhalter * wählt alle Elemente oder Mitglieder. Klammern tragen Array-Indizes ([0]), Slices ([start:end:step]), Vereinigungen ([a,b]) und Filterausdrücke ([?(@.price < 10)], wobei @ das getestete Element ist). Mit diesen Bausteinen kannst du ein einzelnes Feld aus einer tief verschachtelten API-Antwort herausziehen, Werte in Tests prüfen, Datentransformationen in Systemen wie Kubernetes, AWS Step Functions und Azure Logic Apps steuern oder strukturierte Daten aus unregelmäßigem JSON extrahieren — alles ohne imperativen Traversierungscode. JSONPath ist außerdem berüchtigt inkonsistent zwischen Implementierungen, was genau das Problem ist, das ein guter Tester aufdeckt, bevor es die Produktion erreicht.

Dieser Tester liefert zwei Engines. Die Voreinstellung ist eine RFC-9535-Engine: RFC 9535 ist die formale Spezifikation von JSONPath der IETF vom Februar 2024, das erste Mal, dass die Sprache nach fünfzehn Jahren divergierender Implementierungen präzise standardisiert wurde. Sie definiert eine exakte Grammatik, das Konzept normalisierter Pfade für Ergebnisse und fünf Standardfunktionen — length(), count(), match(), search(), value(). Unsere RFC-9535-Engine ist eine abhängigkeitsfreie Implementierung, die kein eval verwendet, sie parst und interpretiert Ausdrücke also mit ihrer eigenen Grammatik, statt sie zu JavaScript zu kompilieren. Die zweite Engine ist Classic (Goessner), der De-facto-Dialekt von 2007, den die meisten älteren Online-Tools und Bibliotheken implementieren; wechsle zu ihr, um Ergebnisse aus einem Tool wie jsonpath.com zu reproduzieren oder einen aus Legacy-Code kopierten Ausdruck auszuführen. Die beiden Dialekte stimmen bei gängigen Pfaden überein, divergieren aber in den Randfällen — Filter-Leerraum und -Quoting, Vereinigungsreihenfolge, wie fehlende Mitglieder verglichen werden und welche Funktionen existieren — sodass die Möglichkeit, an einem Ort zwischen ihnen umzuschalten, der schnellste Weg ist zu diagnostizieren, warum sich ein Ausdruck anders verhält als erwartet.

Was der Tester über rohe Werte hinaus aufdeckt: Das Ergebnis einer JSONPath-Abfrage ist eine Knotenliste, und dieses Tool kann sie auf drei Arten zeigen. Die Ansicht Werte stellt die übereinstimmenden Knoten als JSON-Array dar, genau das, was du im Code konsumieren würdest. Die Ansicht Pfade stellt den normalisierten Pfad jeder Übereinstimmung dar — einen kanonischen, in Klammern gesetzten und gequoteten Ort wie $['store']['book'][0]['title'], der eindeutig identifiziert, wo im Dokument der Wert liegt, unabhängig davon, wie der Ausdruck geschrieben war. Zwei Ausdrücke, die denselben Knoten auswählen, erzeugen denselben normalisierten Pfad, was die Ansicht Pfade für das Debugging unschätzbar macht. Die Ansicht Beide zeigt Werte und Pfade nebeneinander. Eine Statistikzeile meldet, wie viele Knoten übereinstimmten.

Sicherheit ist hier ein erstklassiges Anliegen. Viele Online-JSONPath-Evaluatoren laufen auf einem Server oder betten eine Bibliothek ein, die Filterprädikate mit JavaScript-eval auswertet — das Design, das die als CVE-2024-21534 und CVE-2025-1302 erfassten Remote-Code-Execution-Schwachstellen in weit verbreiteten JSONPath-Paketen hervorbrachte. Dieses Tool verwendet überhaupt kein eval. Die RFC-9535-Engine hat keinen eval-Pfad, und die Classic-Engine basiert auf einer gepatchten, fixierten Version von jsonpath-plus mit explizit deaktiviertem eval. Das schließt die RCE-Klasse von Bugs und lässt das Tool unter einer strengen Content-Security-Policy laufen, die unsafe-eval verbietet. Jede Auswertung ist lokal: Dein JSON und dein Ausdruck verlassen nie die Seite, werden nie protokolliert und nie auf der Festplatte gespeichert — nur deine Engine- und Ansichtseinstellungen bleiben in localStorage erhalten. Das macht das Tool sicher für proprietäre API-Payloads, geschwärzte Logs, interne Konfigurationen und alle Daten mit einem Schema, das du nicht in einen serverbasierten Dienst einfügen würdest.

Wenn das Hantieren mit JSON deine Aufgabe ist, kombiniere dies mit den anderen JSON-Tools der Website: Formatiere und präsentiere deine Eingabe schön mit dem JSON-Formatierer, vergleiche zwei Dokumente mit dem JSON-Diff, prüfe eine Payload gegen ein Schema mit dem JSON-Schema-Validator, oder verwandle eine Beispielantwort in typisierte Interfaces mit JSON to TypeScript.

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

Hauptfunktionen

RFC-9535-Standard-Engine (kein eval)

Die voreingestellte Engine implementiert RFC 9535, die formale JSONPath-Spezifikation der IETF von 2024 — exakte Grammatik, normalisierte Pfade und die fünf Standardfunktionen. Sie ist abhängigkeitsfrei und verwendet kein eval, sie parst und interpretiert Ausdrücke also mit ihrer eigenen Grammatik, statt sie zu JavaScript zu kompilieren. Sie läuft unter einer strengen Content-Security-Policy.

Classic-(Goessner-)Kompatibilitätsmodus

Ein Umschalter wechselt zu einer Goessner-kompatiblen Engine (auf Basis von jsonpath-plus, mit deaktiviertem eval konstruiert), sodass aus älteren Tools wie jsonpath.com kopierte Ausdrücke sich so verhalten, wie du sie dort gesehen hast. Wechsle zwischen RFC 9535 und Classic, um Ergebnisse zu vergleichen und zu diagnostizieren, warum ein Pfad über Dialekte hinweg anders übereinstimmt.

Drei Ergebnisansichten: Werte, Pfade, Beide

Werte stellt übereinstimmende Knoten als JSON-Array dar, genau das, was du im Code konsumierst. Pfade stellt den normalisierten Pfad jeder Übereinstimmung wie $['store']['book'][0]['title'] dar. Beide zeigt sie nebeneinander, sodass du jeden Wert seinem genauen Ort zuordnen kannst. Die aktive Ansicht bleibt sitzungsübergreifend erhalten.

Normalisierte Pfade für jede Übereinstimmung

Jedes Ergebnis trägt seinen kanonischen, in Klammern gesetzten und gequoteten normalisierten Pfad — die RFC-9535-Methode, den Ort eines Knotens eindeutig zu identifizieren, unabhängig davon, wie der Ausdruck geschrieben war. Zwei Ausdrücke, die denselben Knoten treffen, erzeugen denselben normalisierten Pfad, was das Debugging mehrdeutiger Abfragen einfach macht.

Vollständige Selektor-Unterstützung

Wurzel $, aktuelles Element @, Kind .name, rekursiver Abstieg ..name, Platzhalter [*], Array-Index [0], Slice [start:end:step], Vereinigung [a,b] und Filter [?()] mit Vergleichs- und Logikoperatoren. Ein eingebauter Spickzettel dokumentiert jeden Selektor, sodass du nie die Seite verlassen musst, um einen nachzuschlagen.

RFC-9535-Funktionserweiterungen

Rufe length(), count(), match(), search() und value() innerhalb von Ausdrücken auf — zähle die Elemente eines Arrays, teste einen String gegen ein I-Regexp-Muster oder filtere nach der Größe einer verschachtelten Liste. Diese Standardfunktionen sind in der voreingestellten Engine verfügbar; das Tool weist dich an, die Engine zu wechseln, wenn du sie im Classic-Modus aufrufst.

Formatieren, Hochladen & Beispiele

JSON formatieren stellt deine Eingabe schön dar, sodass die Struktur vor dem Abfragen lesbar ist. Hochladen liest eine .json- oder .txt-Datei vollständig im Browser — sie wird nie irgendwohin gesendet. Das Dropdown Beispiele lädt bekannte, funktionierende Startausdrücke gegen Beispieldaten, sodass du die Engine arbeiten siehst, bevor du einen Pfad anpasst.

Permalink-Teilen (kein Upload)

Link kopieren kodiert das JSON, den Ausdruck, die Engine und die Ansicht in den URL-Hash. Browser übertragen URL-Fragmente nie in Anfragen, sodass ein geteilter Link deinen vollständigen Zustand auf der Maschine des Empfängers reproduziert, ohne go-tools.org-Server zu berühren. Eigenständig und prüffreundlich für gemeinsames Debugging.

100 % privat, nur im Browser

Dein JSON und dein Ausdruck verlassen nie dein Gerät. Keine Netzwerkanfragen, keine Protokollierung, keine Analyse dessen, was du tippst — überprüfe es in DevTools → Netzwerk. Nur die Engine- und Ansichtseinstellungen bleiben in localStorage erhalten. Sicher für proprietäre Payloads, geschwärzte Logs und alle Daten, die du nicht in jsonpath.com einfügen würdest.

Durchgearbeitete Beispiele

Jeden Buchtitel aus einem Buchladen-Dokument auswählen

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

Füge das klassische Goessner-Buchladen-JSON ein, tippe den Ausdruck, und die Ansicht Werte liefert ein JSON-Array aller vier Titel. Wechsle zu Pfade, um jedes Ergebnis als normalisierten Pfad wie $['store']['book'][0]['title'] zu sehen. Der Platzhalter [*] iteriert über jedes Element des book-Arrays; .title projiziert ein Mitglied aus jedem davon.

Bücher günstiger als 10 mit einem Filterausdruck filtern

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

Der Filterselektor [?()] behält nur Array-Elemente, bei denen das Prädikat wahr ist; @ ist das aktuelle Element. Gegen die Buchladen-Daten (Preise 8.95, 12.99, 8.99, 22.99) qualifizieren sich zwei Bücher. Beide Engines akzeptieren diese Form, aber beachte, dass Classic (Goessner) denselben Filter als [?(@.price<10)] schreibt — wechsle die Engine, wenn du einen Ausdruck aus einem älteren Tool kopiert hast.

Den gesamten Baum mit rekursivem Abstieg durchlaufen

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

Der Operator .. steigt in jede Ebene des Dokuments hinab und sammelt jedes author-Mitglied, wo immer es auftaucht, unabhängig von der Schachtelungstiefe. Rekursiver Abstieg ist der schnellste Weg, ein Feld aus einer tief verschachtelten oder unregelmäßigen Struktur herauszuziehen, ohne den vollständigen Pfad ausbuchstabieren zu müssen.

Ein Array mit [start:end:step] schneiden

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

Array-Slices folgen derselben halboffenen [start:end]-Konvention wie Python und JavaScript: Index 0 bis ausschließlich Index 2 liefert die ersten beiden Bücher. Füge ein drittes Feld für einen Schritt hinzu — $.store.book[::2] nimmt jedes zweite Element. Die obere Grenze ist exklusiv, eine häufige Off-by-one-Falle, die die Ansicht Pfade offensichtlich macht.

Nach Titellänge mit der RFC-9535-Funktion length() filtern

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() ist eine der fünf Standardfunktionen von RFC 9535 und nur innerhalb eines Filterausdrucks [?...] gültig — niemals als eigenständiges Pfadsegment wie $.store.book.length(), das die RFC-9535-Grammatik ablehnt (diese Segmentform ist eine jsonpath-plus-Erweiterung, kein Standard-JSONPath). Hier behält der Filter jedes Buch, dessen Titel mehr als 15 Zeichen hat; gegen die Buchladen-Daten werden die Titel mit mehr als 15 Zeichen ausgewählt (zum Beispiel "Sayings of the Century" und "The Lord of the Rings"), während kürzere wie "Moby Dick" und "Sword of Honour" ausgeschlossen werden. count(), match(), search() und value() werden ebenfalls innerhalb von Filtern verwendet. Diese Funktionen sind ein RFC-9535-Feature — wechsle zur Standard-Engine (der Voreinstellung), um sie zu nutzen; der Classic-(Goessner-)Modus implementiert sie nicht.

Eine Vereinigung zweier benannter Mitglieder auswählen

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

Ein Vereinigungsselektor [a,b] sammelt mehrere Kinder in einem Ausdruck. Hier zieht er sowohl den Titel als auch den Autor des ersten Buches heraus. Vereinigungen funktionieren auch mit Array-Indizes — [0,2] greift das erste und dritte Element. Die Ansicht Beide paart jeden Wert mit seinem normalisierten Pfad, sodass du genau siehst, welches Mitglied welches Ergebnis erzeugt hat.

So verwendest du den JSONPath-Tester

  1. 1

    JSON einfügen oder hochladen

    Ziehe JSON in das Eingabefeld, füge es ein oder klicke auf Hochladen, um eine .json-/.txt-Datei von der Festplatte zu laden. JSON formatieren rückt das Dokument neu ein. Ungültiges JSON wird inline mit einer Parser-Meldung markiert, bevor du abfragst.

  2. 2

    Eine Engine wählen

    RFC 9535 (der IETF-Standard von 2024, kein eval) ist die Voreinstellung. Wechsle zu Classic (Goessner), wenn du einen aus einem älteren Tool wie jsonpath.com kopierten Ausdruck ausführst, damit die Ergebnisse mit dem übereinstimmen, was du dort gesehen hast.

  3. 3

    Deinen JSONPath-Ausdruck eingeben

    Das führende $ wird dir angezeigt. Beginne mit einem Kindpfad wie .store.book[*].title, einem Index wie [0], einem rekursiven Abstieg wie ..author oder einem Filter wie [?(@.price < 10)]. Die Ergebnisse aktualisieren sich live während des Tippens.

  4. 4

    Die Ergebnisansicht umschalten

    Werte zeigt ein JSON-Array übereinstimmender Werte. Pfade zeigt den normalisierten Pfad jeder Übereinstimmung wie $['store']['book'][0]['title']. Beide zeigt sie nebeneinander, sodass du jeden Wert seinem genauen Ort im Dokument zuordnen kannst.

  5. 5

    Das Ergebnis kopieren oder einen Permalink teilen

    Ergebnis kopieren legt die Ausgabe in deine Zwischenablage. Link kopieren kodiert das JSON, den Ausdruck, die Engine und die Ansicht in einen URL-Hash (kein Upload), sodass ein Kollege die exakte Abfrage lokal auf der eigenen Maschine reproduzieren kann.

Häufige JSONPath-Fehler

Das führende $ als Wurzel vergessen

Jeder JSONPath-Ausdruck beginnt an der Wurzel, geschrieben als $. Es wegzulassen (oder den Pfad zu schreiben, als wäre $ implizit) führt dazu, dass die meisten Engines den Ausdruck ablehnen. Der Tester zeigt dir das $, beginne deine Eingabe also mit dem nächsten Selektor — einem Punkt, einer Klammer oder einem rekursiven Abstieg.

✗ Falsch
store.book[*].title  →  invalid (no root)
✓ Richtig
$.store.book[*].title  →  selects every title

Off-by-one-Slice — den End-Index als inklusive erwartet

Slices sind halboffen: [start:end] läuft bis ausschließlich end. [0:2] liefert zwei Elemente (Indizes 0 und 1), nicht drei. Um das letzte Element per Index einzuschließen, verwende [start:] oder schiebe die obere Grenze eins darüber hinaus.

✗ Falsch
$.store.book[0:2]  →  first TWO books, not three
✓ Richtig
$.store.book[0:3]  →  first three books (indices 0,1,2)

Einen Classic-Ausdruck in der RFC-9535-Engine verwendet (oder umgekehrt)

Ein aus jsonpath.com oder jsonpath-plus kopierter Ausdruck kann unter RFC 9535 wegen Filter-, Vereinigungs- und Funktionsunterschieden anders parsen oder übereinstimmen. Wenn die Ergebnisse falsch aussehen, stelle den Engine-Umschalter auf den Dialekt um, für den der Ausdruck geschrieben war.

✗ Falsch
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ Richtig
Switch engine to Classic (Goessner)  →  reproduces the original result

Eine RFC-9535-Funktion als eigenständiges Segment aufgerufen

length(), count(), match(), search() und value() sind RFC-9535-Funktionserweiterungen, die nur innerhalb eines Filters [?...] gültig sind. Ein eigenständiger Segment-Aufruf wie $.store.book.length() wird von der RFC-9535-Grammatik abgelehnt (er ist eine jsonpath-plus-Erweiterung, kein Standard). Rufe die Funktion innerhalb eines Filters auf und verwende die voreingestellte RFC-9535-Engine — die Classic-(Goessner-)Engine implementiert diese Funktionen nicht.

✗ Falsch
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ Richtig
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

Das @ innerhalb eines Filterausdrucks vergessen

Innerhalb eines Filters [?()] ist das aktuelle Element @, nicht $. $.price zu schreiben verweist zurück auf die Dokumentwurzel statt auf das getestete Element, sodass der Filter nichts oder alles auswählt. Verwende @, um Mitglieder des gefilterten Elements zu adressieren.

✗ Falsch
$.store.book[?($.price < 10)]  →  wrong scope
✓ Richtig
$.store.book[?(@.price < 10)]  →  books under 10

Einen Mitgliedsnamen mit der falschen Syntax gequotet

Klammernotation braucht Anführungszeichen um String-Schlüssel: $['store'] oder $.store funktionieren beide, aber $[store] (in Klammern ohne Anführungszeichen) ist ein Index-/Identifikator-Fehler. Verwende Anführungszeichen innerhalb von Klammern für jeden Schlüssel mit Leerzeichen, Punkten oder Sonderzeichen: $['first name'].

✗ Falsch
$[store][book]  →  invalid bracket selectors
✓ Richtig
$['store']['book']  →  same as $.store.book

Erwartet, dass der rekursive Abstieg auf der ersten Ebene stoppt

$..author stoppt nicht oben — es sammelt jedes author-Mitglied in jeder Tiefe. Wenn du nur direkte Kinder willst, buchstabiere den Pfad aus. Rekursiver Abstieg über ein großes Dokument kann weit mehr Knoten als beabsichtigt liefern.

✗ Falsch
$..price  →  every price anywhere in the tree
✓ Richtig
$.store.book[*].price  →  only book prices

Wer dieses Tool nutzt

Felder aus einer API-Antwort extrahieren
Ziehe Request-IDs, verschachtelte Ressourcenattribute oder eine Liste von Namen aus einer JSON-Payload, ohne Traversierungscode zu schreiben. Baue den Pfad hier gegen eine Beispielantwort, bestätige in der Ansicht Werte, dass er genau die gewünschten Knoten liefert, und füge den validierten Ausdruck dann in deine Anwendung oder deinen Test ein.
Assertions für Integrationstests schreiben
Viele Test-Frameworks und Contract-Testing-Tools (REST Assured, Karate, Postman) verwenden JSONPath, um auf Antwort-Bodies zu prüfen. Entwirf den Assertion-Pfad hier, verifiziere, dass er gegen eine echte Antwort den richtigen Knoten auswählt, und kopiere ihn in deinen Test — und fange einen falschen Pfad ab, bevor die Suite rot wird.
Datentransformationen in Pipelines konfigurieren
Kubernetes, AWS Step Functions, Azure Logic Apps und viele ETL-Tools akzeptieren JSONPath, um Felder in Ereignis-Payloads zu adressieren. Prototypisiere den exakten Pfad hier gegen ein repräsentatives Ereignis, bestätige, dass er auflöst, und füge ihn in deine Pipeline-Konfiguration ein, in der Gewissheit, dass er dorthin zeigt, wo du beabsichtigst.
Ein jsonpath.com-Ergebnis privat reproduzieren
Du hast einen Ausdruck von einem serverbasierten Evaluator, kannst deine Daten aber nicht auf eine Drittanbieter-Website einfügen? Wechsle in den Classic-(Goessner-)Modus, lade dein JSON und reproduziere dasselbe Ergebnis lokal — keine Payload verlässt je deinen Browser, sodass proprietäre Daten auf deiner Maschine bleiben.
Legacy-Ausdrücke auf RFC 9535 migrieren
Wechselst du zu einem System, das RFC-9535-Konformität bewirbt? Führe einen Legacy-Ausdruck im Classic-Modus aus, wechsle dann zur RFC-9535-Engine, um zu sehen, ob er noch parst und dieselben Knoten trifft. Der Dual-Engine-Vergleich deckt Filter-, Vereinigungs- und Funktionsunterschiede auf, die du sonst in der Produktion treffen würdest.
Debuggen, warum ein Pfad die falschen Knoten liefert
Ein Pfad, der zu viel oder zu wenig auswählt, ist allein aus den Werten schwer nachzuvollziehen. Wechsle zur Ansicht Pfade, um den normalisierten Ort jeder Übereinstimmung zu sehen — den genauen Array-Index, die genaue Mitgliedskette — und der Off-by-one-Slice oder der verirrte rekursive Abstieg wird sofort offensichtlich.
JSONPath lehren oder prüfen
Öffne einen funktionierenden Ausdruck gegen Beispieldaten und gehe ihn Selektor für Selektor durch, wechsle zwischen Werte und Pfade, sodass der Lernende sowohl sieht, was ausgewählt wird, als auch, wo es liegt. Der Spickzettel und die durchgearbeiteten Beispiele bieten eine strukturierte Referenz für Code-Review oder Onboarding.

Hinweise zu Engine & Algorithmus

RFC-9535-Engine (jsonpath-rfc9535, abhängigkeitsfrei)
Die voreingestellte Engine implementiert die IETF-RFC-9535-Grammatik direkt: Sie tokenisiert und parst den Ausdruck in einen abstrakten Syntaxbaum und interpretiert ihn gegen das Dokument. Es gibt nirgendwo im Pfad ein eval und keinen Function-Konstruktor, sie ist also immun gegen die eval-Injection-Klasse von Bugs und läuft unter einer strengen Content-Security-Policy.
Classic-Engine (jsonpath-plus, eval deaktiviert)
Die Classic-(Goessner-)Engine ist jsonpath-plus, fixiert auf eine gepatchte Version (>= 10.4.0) und mit der eval-Option explizit auf false konstruiert. Das erhält die Goessner-Dialekt-Kompatibilität und schließt zugleich die als CVE-2024-21534 und CVE-2025-1302 erfassten Remote-Code-Execution-Vektoren, die den standardmäßigen eval-basierten Filterpfad der Bibliothek betrafen.
Erzeugung normalisierter Pfade
Jede Übereinstimmung wird mit ihrem normalisierten RFC-9535-Pfad gemeldet — einer kanonischen Form mit in einfachen Anführungszeichen gesetzter Klammernotation ($['store']['book'][0]['title']) und Array-Indizes als bloße Ganzzahlen. Normalisierte Pfade sind stabil und pro Knoten eindeutig, sodass äquivalente Ausdrücke identische Pfade ergeben, worauf sich die Ansichten Pfade und Beide für die eindeutige Ergebnisidentifikation verlassen.
Faul geladene Engine-Chunks
Beide Engines werden als separate JavaScript-Chunks erst beim ersten Auswählen geladen, sodass die anfängliche Seite leicht bleibt und die nicht genutzte Engine nie heruntergeladen wird. Das Wechseln der Engines wertet den aktuellen Ausdruck sofort gegen das aktuelle Dokument neu aus, ohne Seiten-Reload.
Lokales Dateilesen und JSON-Formatierung
Die Schaltfläche Hochladen verwendet die Browser-FileReader-API, um eine .json- oder .txt-Datei vollständig clientseitig in die Eingabe zu lesen — die Datei wird nie übertragen. JSON formatieren parst und serialisiert die Eingabe mit Zwei-Leerzeichen-Einrückung neu und deckt Parse-Fehler inline auf, sodass fehlerhaftes JSON vor der Auswertung abgefangen wird.
Permalinks über URL-Hash (nie übertragen)
Der Teilenzustand wird im location.hash-Fragment kodiert und trägt das JSON, den Ausdruck, die aktive Engine und die Ergebnisansicht. Browser schließen das Fragment nie in HTTP-Anfragen ein, sodass go-tools.org-Server null Daten empfangen, wenn ein Permalink geöffnet wird; die Hydratation geschieht vollständig auf dem Gerät des Empfängers.

JSONPath-Best-Practices

Wähle die Engine, die zu deinem Ziel passt
Wenn dein nachgelagertes System RFC-9535-Konformität bewirbt, schreibe und validiere gegen die RFC-9535-Engine. Wenn du einen Ausdruck aus einem älteren Tool oder einer älteren Bibliothek reproduzierst oder pflegst, verwende Classic (Goessner). Die Validierung gegen den falschen Dialekt ist der häufigste Grund, warum ein im Tester funktionierender Pfad in der Produktion fehlschlägt.
Verifiziere mit der Ansicht Pfade, nicht nur Werte
Die Ansicht Werte sagt dir, was übereinstimmte; die Ansicht Pfade sagt dir, wo. Wenn eine Abfrage richtig aussehende Werte liefert, kann sie sie dennoch vom falschen Ort auswählen — ein verirrter rekursiver Abstieg oder ein zu breiter Platzhalter. Prüfe die normalisierten Pfade, um zu bestätigen, dass der Ausdruck genau die Knoten trifft, die du beabsichtigst.
Achte auf das exklusive Ende eines Slice
[0:2] wählt die Indizes 0 und 1, nicht 0 bis 2 — die obere Grenze ist exklusiv, genau wie bei Python und JavaScript. Off-by-one-Slice-Fehler sind der häufigste JSONPath-Bug. Verwende die Ansicht Pfade, um den genauen Index jedes ausgewählten Elements zu lesen und die Grenze zu bestätigen, bevor du auslieferst.
Bevorzuge einen expliziten Pfad gegenüber rekursivem Abstieg, wenn möglich
$..price ist bequem, trifft aber jeden price irgendwo im Dokument, auch solche, die du nicht beabsichtigt hast. Wenn du die Struktur kennst, buchstabiere den Pfad aus ($.store.book[*].price), damit die Abfrage präzise und vorhersehbar bleibt, während die Daten wachsen. Behalte .. für wirklich unregelmäßige oder unbekannte Formen vor.
Halte Leerraum und Quoting in Filtern konsistent
RFC 9535 folgt seiner Grammatik für Filterausdrücke exakt, während der klassische Dialekt lockerer ist. Schreibe Filter sauber — quote String-Literale mit einfachen Anführungszeichen ('fiction'), halte Operatoren mit Leerzeichen umgeben und vermeide es, dich auf nachsichtiges Parsen zu verlassen — sodass derselbe Ausdruck unabhängig davon, welche Engine oder Bibliothek ihn schließlich ausführt, gleich ausgewertet wird.

Häufig gestellte Fragen

Werden mein JSON oder mein JSONPath-Ausdruck an euren Server gesendet?
Nein. Jede Auswertung läuft in JavaScript in deinem Browser. Dein JSON-Dokument und dein JSONPath-Ausdruck werden nicht hochgeladen, nicht protokolliert, nicht auf der Festplatte gespeichert und an keinen Dritten gesendet. Nur deine UI-Einstellungen — die aktive Engine (RFC 9535 oder Classic) und die Ergebnisansicht (Werte / Pfade / Beide) — werden in localStorage gespeichert, damit sich die Seite sie beim nächsten Besuch merkt; das JSON und der Ausdruck selbst werden nie persistiert. Du kannst das überprüfen, indem du die DevTools → Netzwerk öffnest: Das Tippen in einem der Felder löst null Anfragen aus. Das macht dieses Tool sicher für proprietäre API-Payloads, geschwärzte Log-Samples, interne Konfigurationen und alles andere, das du nicht in einen serverbasierten Evaluator wie jsonpath.com einfügen würdest.
Was ist JSONPath und wofür wird es verwendet?
JSONPath ist eine Abfragesprache für JSON, genauso wie XPath eine Abfragesprache für XML ist. Du schreibst einen Pfadausdruck — zum Beispiel $.store.book[*].author — und der Evaluator liefert jeden Wert im Dokument, den der Pfad auswählt. Es wird verwendet, um bestimmte Felder aus API-Antworten herauszuziehen, um Werte in Integrationstests zu prüfen, um Datentransformationen in Tools wie Jenkins, Kubernetes, AWS Step Functions und Azure Logic Apps zu konfigurieren und um Daten aus großem oder unregelmäßigem JSON ohne imperativen Traversierungscode zu extrahieren. Ein Ausdruck baut sich aus einer Achse von Selektoren auf: $ (die Wurzel), . oder [] (Kindzugriff), .. (rekursiver Abstieg), * (Platzhalter), [start:end:step] (Array-Slice), [a,b] (Vereinigung) und [?()] (Filter). Dieser Tester wertet den Ausdruck live aus und zeigt sowohl die übereinstimmenden Werte als auch ihre normalisierten Pfade.
Was ist der Unterschied zwischen RFC 9535 und der klassischen Goessner-Syntax?
Klassisches JSONPath ist die De-facto-Syntax, die Stefan Goessner 2007 veröffentlichte. Sie wurde weit verbreitet implementiert, aber nie formal standardisiert, sodass subtile Verhaltensweisen — wie Filter geschrieben werden, wie Vereinigungen und die Wurzelfunktion arbeiten, wie fehlende Werte verglichen werden — zwischen Bibliotheken auseinanderdrifteten. RFC 9535, im Februar 2024 von der IETF veröffentlicht, ist die erste formale Spezifikation von JSONPath. Sie legt eine präzise Grammatik fest, definiert normalisierte Pfade für Ergebnisse und fügt Standardfunktionen hinzu (length, count, match, search, value). Die beiden liegen nah beieinander, sind aber nicht identisch: RFC 9535 ist strenger bei Leerraum und Quoting in Filtern, definiert die Vergleichssemantik für fehlende Mitglieder und lehnt einige lockere Konstrukte ab, die der klassische Dialekt tolerierte. Dieses Tool verwendet standardmäßig die RFC-9535-Engine (eine abhängigkeitsfreie No-eval-Implementierung) und lässt dich für Abwärtskompatibilität zu einer Classic-(Goessner-)Engine wechseln.
Warum liefert derselbe Ausdruck in den beiden Engines unterschiedliche Ergebnisse, und wie verwende ich einen von jsonpath.com kopierten Ausdruck?
Weil RFC 9535 und der klassische Goessner-Dialekt in den Randfällen wirklich unterschiedliche Regeln haben — Filter-Leerraum und -Quoting, Vereinigungsreihenfolge, wie fehlende Mitglieder verglichen werden und welche Funktionen existieren. Ein für eine Engine geschriebener Ausdruck kann in der anderen anders übereinstimmen (oder nicht parsen). Wenn du einen Ausdruck aus einem älteren Tool wie jsonpath.com, jsonpath-plus oder einem Jayway-basierten Dienst kopiert hast, stelle den Engine-Umschalter oben auf Classic (Goessner): Dieser Modus führt einen Goessner-kompatiblen Evaluator aus (auf Basis von jsonpath-plus, mit deaktiviertem eval konstruiert) und reproduziert das Verhalten, das du im Quell-Tool gesehen hast. Wenn du einen neuen Ausdruck schreibst oder ein System anvisierst, das RFC-9535-Konformität bewirbt, behalte die voreingestellte RFC-9535-Engine. Der Spickzettel und die eingebauten Beispiele sind so geschrieben, dass sie in beiden Engines identisch ausgewertet werden, sodass du einen bekannten, funktionierenden Ausgangspunkt hast.
Wie funktionieren Filterausdrücke [?()]?
Ein Filterselektor behält nur die Array-Elemente (oder Objektmitglieder), für die ein Prädikat wahr ist. Innerhalb des Filters bezieht sich @ auf das aktuell getestete Element. $.store.book[?(@.price < 10)] liefert jedes Buch, dessen price-Mitglied kleiner als 10 ist. Du kannst gegen Literale vergleichen (@.isbn, @.category == 'fiction'), Bedingungen mit && und || kombinieren, auf die Existenz eines Mitglieds testen (@.isbn wählt Elemente, die überhaupt eine isbn haben) und in RFC 9535 die Funktionserweiterungen innerhalb des Prädikats verwenden (?(length(@.tags) > 2)). Vergleichsoperatoren sind ==, !=, <, <=, >, >=. RFC 9535 ist präzise bei Typen: Der Vergleich eines fehlenden Mitglieds mit einem Wert ist wohldefiniert und wirft keinen Fehler. Der klassische Dialekt ist lockerer bei Leerraum, sodass dort sowohl [?(@.price<10)] als auch [?(@.price < 10)] akzeptiert werden; RFC 9535 folgt seiner Grammatik exakt.
Was macht der rekursive Abstieg (..)?
Der Operator .. durchsucht jede Ebene des Dokuments, nicht nur die unmittelbaren Kinder. $..author sammelt jedes author-Mitglied, wo immer es auftritt — innerhalb des Objekts auf oberster Ebene, innerhalb von Arrays, innerhalb verschachtelter Objekte, in beliebiger Tiefe. Es ist der schnellste Weg, ein Feld aus einer tief verschachtelten oder unregelmäßig geformten Struktur zu extrahieren, wenn du den vollständigen Pfad nicht ausbuchstabieren willst (oder kannst). Du kannst .. mit jedem Selektor verketten: $..book[*] findet jedes Element jedes book-Arrays irgendwo im Baum, $..* zählt jeden Wert im Dokument auf, und $..['price'] sammelt alle price-Mitglieder. Rekursiver Abstieg kann sehr viel treffen — wechsle zur Ansicht Pfade, um über den normalisierten Pfad genau zu sehen, woher jedes Ergebnis stammt.
Was sind die RFC-9535-Funktionen length(), count(), match(), search() und value()?
RFC 9535 definiert fünf Standard-Funktionserweiterungen, und die zentrale Regel ist, dass sie nur innerhalb eines Filterausdrucks [?...] aufrufbar sind — niemals als eigenständiges Pfadsegment. $.store.book.length() zu schreiben, ist kein gültiges RFC 9535, und die Standardgrammatik lehnt es ab (diese Segment-Aufrufform ist eine jsonpath-plus-Erweiterung, nicht Teil der Spezifikation). length() liefert die Länge eines Strings, Arrays oder Objekts, sodass du damit nach Größe filterst: $.store.book[?length(@.title) > 15] behält Bücher, deren Titel länger als 15 Zeichen ist. count() liefert die Anzahl der Knoten, die eine Knotenliste enthält, wiederum innerhalb eines Filters: $.store.book[?(count(@.authors) > 1)]. match() testet, ob ein String einem regulären Ausdruck gegen den gesamten Wert entspricht, und search() testet auf eine Übereinstimmung irgendwo innerhalb des Strings — beide nehmen ein I-Regexp-Muster. value() wandelt eine Einzelknoten-Knotenliste in ihren Wert um, damit sie in einem Vergleich verwendet werden kann. Diese Funktionen sind Teil des RFC-9535-Standards, daher sind sie in der voreingestellten Engine verfügbar; die Classic-(Goessner-)Engine implementiert sie nicht. Wenn ein funktionsbasierter Ausdruck fehlschlägt, prüfe, ob du ihn innerhalb eines Filters aufrufst und der Engine-Umschalter auf RFC 9535 steht.
Wie funktionieren Array-Slices [start:end:step]?
Slices verwenden dieselbe halboffene Konvention wie Python und JavaScript: [start:end] wählt von Index start bis ausschließlich Index end, sodass [0:2] die ersten beiden Elemente (Indizes 0 und 1) liefert. Lasse eine Grenze weg, um bis zum Rand zu laufen — [2:] ab Index 2, [:3] für die ersten drei. Ein negativer Index zählt vom Ende: [-1:] wählt das letzte Element. Das optionale dritte Feld ist ein Schritt — [::2] nimmt jedes zweite Element, [::-1] kehrt um (in Engines, die negative Schritte unterstützen). Die exklusive obere Grenze ist der mit Abstand häufigste Slice-Fehler; die Ansicht Pfade zeigt den genauen Index jedes ausgewählten Elements, sodass du die Grenze auf einen Blick bestätigen kannst.
Was ist ein Vereinigungsselektor und wie wähle ich mehrere Schlüssel auf einmal aus?
Ein Vereinigungsselektor listet mehrere Namen oder Indizes innerhalb einer Klammer auf und sammelt sie alle: $['title','author'] wählt beide Mitglieder aus einem Objekt, und $.store.book[0,2] wählt das erste und dritte Element des book-Arrays. Du kannst ihn mit anderen Selektoren mischen — $.store.book[*]['title','price'] zieht Titel und Preis jedes Buches. Vereinigungen sind praktisch, wenn du eine feste Projektion einiger weniger Felder statt eines ganzen Objekts oder eines Platzhalters möchtest. Die Ansicht Beide ist der klarste Weg, ein Vereinigungsergebnis zu lesen, weil sie jeden ausgewählten Wert mit seinem normalisierten Pfad paart, sodass du erkennen kannst, welcher Name oder Index jeden Eintrag erzeugt hat.
Kann ich eine JSONPath-Abfrage und ihr JSON über einen Link teilen?
Ja — und der Link erfordert keinen Server-Roundtrip. Klicke in der Aktionsleiste auf Link kopieren: Der Tester kodiert das JSON, den Ausdruck, die aktive Engine und die Ergebnisansicht in den URL-Hash. Wer den Link öffnet, hydriert die Seite lokal auf der eigenen Maschine mit demselben Zustand. Weil die Daten im Hash-Fragment leben, werden sie nie an den go-tools.org-Server übertragen — Browser senden das Fragment nicht in HTTP-Anfragen mit — und sie tauchen nie in unseren Zugriffsprotokollen auf. Die Linklänge wächst mit der Größe des JSON, teile bei großen Dokumenten also nur den Ausdruck und lasse den Empfänger seine eigenen Daten einfügen, oder verwende die Schaltfläche Hochladen, um eine Datei lokal zu laden. Das macht Permalinks sicher für gemeinsames Debugging, ohne die Payload einem Backend preiszugeben.
Gibt es eine maximale JSON-Größe?
Die Auswertung wird durch den Speicher deines Browsers begrenzt statt durch eine harte Obergrenze, aber der praktische Sweet Spot sind Dokumente bis zu einigen Megabyte — bequem größer als fast jede einzelne API-Antwort. Sehr große Arrays mit breiten Selektoren (ein rekursiver Platzhalter $..* über Zehntausende von Knoten) erzeugen eine große Ergebnismenge, deren Darstellung länger dauert; grenze den Ausdruck ein, um die Ausgabe lesbar zu halten. Die Schaltfläche Hochladen liest eine .json- oder .txt-Datei vollständig im Browser (sie wird nirgendwohin gesendet), und JSON formatieren rückt die Eingabe neu ein, sodass du die Struktur lesen kannst, bevor du sie abfragst. Bei Datenpipelines im Mehr-Megabyte-Bereich validiere deinen Ausdruck hier gegen einen repräsentativen Ausschnitt und führe denselben Pfad dann in deinem Anwendungscode oder in einem CLI-Tool wie jq aus.
Wie unterscheidet sich das von jsonpath.com und ist es sicher — kein eval?
Vier Unterschiede. (1) Datenschutz: jsonpath.com und die meisten Online-Evaluatoren laufen auf einem Server oder betten eine Bibliothek ein, die Filter mit JavaScript-eval auswertet; dieses Tool läuft vollständig in deinem Browser und verwendet überhaupt kein eval. Die voreingestellte RFC-9535-Engine ist eine abhängigkeitsfreie Implementierung ohne eval-Pfad, und die Classic-(Goessner-)Engine basiert auf jsonpath-plus, fixiert auf einer gepatchten Version mit explizit deaktiviertem eval — was die Remote-Code-Execution-Klasse von Bugs schließt, die als CVE-2024-21534 und CVE-2025-1302 erfasst sind. Das bedeutet auch, dass das Tool unter einer strengen Content-Security-Policy funktioniert. (2) Standards: Dies ist einer der wenigen Online-Tester, die eine echte RFC-9535-Engine anbieten, nicht nur den alten Goessner-Dialekt. (3) Dual-Engine: Du kannst zwischen RFC 9535 und Classic wechseln, um Ergebnisse zu vergleichen oder aus älteren Tools kopierte Ausdrücke nebeneinander auszuführen. (4) Sprachen: Die Oberfläche ist in 15 Sprachen verfügbar. Wenn du nur schnelle Prüfungen mit Legacy-Syntax brauchst, funktioniert jsonpath.com weiterhin; für standardkonforme, private No-eval-Auswertung ist dies die sicherere Wahl.
Was zeigen die Ansichten Werte, Pfade und Beide?
Das Ergebnis einer JSONPath-Abfrage ist eine Knotenliste — eine Menge von Knoten innerhalb deines Dokuments. Die Ansicht Werte stellt diese Knoten als JSON-Array der übereinstimmenden Werte dar, genau das, was du im Code konsumieren würdest. Die Ansicht Pfade stellt stattdessen den normalisierten Pfad jeder Übereinstimmung dar — einen kanonischen, in Klammern gesetzten und gequoteten Ort wie $['store']['book'][0]['title'], der eindeutig identifiziert, wo im Dokument der Wert liegt, unabhängig davon, wie dein Ausdruck geschrieben war. Normalisierte Pfade sind ein RFC-9535-Konzept und für das Debugging unschätzbar: Zwei verschiedene Ausdrücke, die denselben Knoten auswählen, erzeugen denselben normalisierten Pfad. Die Ansicht Beide zeigt die beiden nebeneinander, sodass du jeden Wert auf einen Blick seinem Ort zuordnen kannst. Deine gewählte Ansicht bleibt über localStorage sitzungsübergreifend erhalten.
Funktioniert das offline, und was ist mit einer Content-Security-Policy?
Ja in beiden Punkten. Weil jede Auswertung in deinem Browser ohne Netzwerkaufrufe läuft, funktioniert das Tool weiter, sobald die Seite geladen ist, selbst wenn du offline gehst. Und weil keine der Engines eval oder den Function-Konstruktor zum Auswerten von Filterausdrücken verwendet, läuft das Tool unter einer strengen Content-Security-Policy, die unsafe-eval verbietet — die Policy, die viele sicherheitsbewusste Organisationen durchsetzen und die eval-basierte JSONPath-Bibliotheken bricht. Die RFC-9535-Engine parst und interpretiert Ausdrücke mit ihrer eigenen Grammatik, statt sie zu JavaScript zu kompilieren, und die Classic-Engine ist mit deaktiviertem eval konfiguriert. Wenn du JSONPath in einer gehärteten internen Umgebung auswerten musst, ist dieses Tool darauf ausgelegt, dort ohne Policy-Ausnahmen zu laufen.

Verwandte Werkzeuge

Alle Werkzeuge anzeigen →