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.
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
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
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
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
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
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.
store.book[*].title → invalid (no root)
$.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.
$.store.book[0:2] → first TWO books, not three
$.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.
Classic filter run under RFC 9535 → parse error or unexpected nodes
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.
$.store.book.length() → parse error (not a valid RFC 9535 segment)
$.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.
$.store.book[?($.price < 10)] → wrong scope
$.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'].
$[store][book] → invalid bracket selectors
$['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.
$..price → every price anywhere in the tree
$.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?
Was ist JSONPath und wofür wird es verwendet?
Was ist der Unterschied zwischen RFC 9535 und der klassischen Goessner-Syntax?
Warum liefert derselbe Ausdruck in den beiden Engines unterschiedliche Ergebnisse, und wie verwende ich einen von jsonpath.com kopierten Ausdruck?
Wie funktionieren Filterausdrücke [?()]?
Was macht der rekursive Abstieg (..)?
Was sind die RFC-9535-Funktionen length(), count(), match(), search() und value()?
Wie funktionieren Array-Slices [start:end:step]?
Was ist ein Vereinigungsselektor und wie wähle ich mehrere Schlüssel auf einmal aus?
Kann ich eine JSONPath-Abfrage und ihr JSON über einen Link teilen?
Gibt es eine maximale JSON-Größe?
Wie unterscheidet sich das von jsonpath.com und ist es sicher — kein eval?
Was zeigen die Ansichten Werte, Pfade und Beide?
Funktioniert das offline, und was ist mit einer Content-Security-Policy?
Verwandte Werkzeuge
Alle Werkzeuge anzeigen →Base64-Dekodierer & -Kodierer
Kodierung & Formatierung
Base64 online kostenlos dekodieren und kodieren. Echtzeitkonvertierung mit voller UTF-8- und Emoji-Unterstützung. 100 % privat — läuft in Ihrem Browser. Keine Anmeldung nötig.
Base64-in-Bild-Konverter
Kodierung & Formatierung
Eine Base64-Zeichenkette oder einen Data-URI im Browser zurück in ein Bild dekodieren. Vorschau, Abmessungen & MIME ablesen, dann als PNG, JPG, GIF, SVG herunterladen. Kein Upload.
CSV-zu-JSON-Konverter
Kodierung & Formatierung
CSV im Browser nach JSON konvertieren. RFC 4180, Typinferenz, Kopfzeile, Big-Int-sicher. 100 % privat, kein Upload.
.env zu JSON Konverter
Kodierung & Formatierung
Eine .env-Datei einfügen, sofort JSON erhalten. Datenbankpasswörter, API-Keys und Tokens verlassen nie deinen Browser — 100% privat, kein Upload.
HTML-zu-Markdown-Konverter
Kodierung & Formatierung
HTML im Browser in sauberes Markdown umwandeln — GFM-Tabellen, Aufgabenlisten und Links. ATX-/Setext-Überschriften und Inline- oder Referenzlinks wählen. Ideal für Webinhalte oder das Füttern von LLMs. 100 % privat, kein Upload.
Bild-in-Base64-Konverter
Kodierung & Formatierung
Bilder im Browser in Base64-Data-URIs umwandeln — PNG, JPG, GIF, WebP, SVG, ICO. HTML-, CSS-, Markdown- und JSON-Ausgabe kopieren. 100 % privat, kein Upload.