JSONPath Evaluator
Run JSONPath queries against a JSON document and see the matched values. Supports child, index, slice, wildcard and recursive-descent operators.
Geprüft von Aygul Dovletova · Zuletzt geprüft
So verwendest du den JSONPath-Auswerter
- Füge das JSON-Dokument in den linken Eingabebereich ein. Der Parser ist streng RFC 8259, sodass abschließende Kommas, einfache Anführungszeichen, JS-artige Kommentare oder irrende BOM-Bytes als Parse-Fehler angezeigt werden, bevor der Pfad überhaupt läuft.
- Tippe den Pfadausdruck in das zweite Feld, beginnend mit
$. Mische Punkt-Notation ($.store.book[0].title) und Klammer-Notation ($['store']['book'][0]['title']) frei; verwende Integer-Indizes, Slice-Bereiche, Wildcards und rekursiven Abstieg, wie die Struktur es erfordert. - Drücke "Auswerten", um den Baum zu gehen. Übereinstimmende Werte werden als JSON-Array in Dokumentreihenfolge ausgegeben, auch wenn der Pfad zu einem einzelnen Wert aufgelöst wird.
- Kopiere das Ergebnis-Panel in dein Test-Fixture, dein Fetch-Skript oder einen anderen Tab. Die vollständige Eingabe und Ausgabe bleiben client-seitig; nichts wird zu ZeroUtil oder anderswohin hochgeladen.
Was der Auswerter intern macht
Der Pfad-String wird in einen kleinen geordneten Strom von Opcodes tokenisiert: root (das führende $), child für Punkt- oder quotierter-Klammer-Zugriff, index für Integer-Subscripts (mit negativer Indizierung für End-relative Offsets), slice für exklusive End-Python-artige Bereiche ([start:end] und [start:end:step]), wildcard für * und recursive für den ..-Doppelpunkt-Operator. Der Walker trägt eine Arbeitsmenge von Knoten durch jeden Opcode, wobei die Menge wächst oder schrumpft, wenn die Operatoren anwenden. Die gesamte Pipeline ist eine einzelne reine Funktion in JsonPathEvaluator.logic.ts mit Unit-Test-Abdeckung, keinen eval-Aufrufen und null Laufzeit-Abhängigkeiten.
Rekursiver Abstieg ($..name) ist der teuerste Operator, weil er jeden Knoten unterhalb der aktuellen Front besucht. Die Implementierung führt einen Tiefendurchlauf in Pre-Order durch und gibt Übereinstimmungen in Dokumentreihenfolge aus, was jede andere JSONPath-Bibliothek tut und dem De-facto-Goessner-Referenzverhalten entspricht. Filter-Ausdrücke wie [?(@.price < 10)] und Script-Ausdrücke wie [(@.length-1)] werden absichtlich nicht unterstützt, weil sie einen sandboxed Ausdrucks-Auswerter erfordern und Fragen über Prädikat-Sicherheit bei feindlicher Eingabe aufwerfen.
Ein bearbeitetes Beispiel, Operator für Operator
Nimm das kanonische Goessner-Buchladen-Dokument und beobachte, wie jeder Operator die Arbeitsmenge einengt oder erweitert:
{
"store": {
"book": [
{ "title": "Sayings of the Century", "price": 8.95 },
{ "title": "Moby Dick", "price": 8.99 },
{ "title": "The Lord of the Rings", "price": 22.99 }
],
"bicycle": { "color": "red", "price": 19.95 }
}
}
$.store.book[0].titlegeht Wurzel, dann denstore-Kindknoten, dann Index 0 desbook-Arrays, dann seinentitle. Ergebnis:["Sayings of the Century"].$.store.book[*].priceverwendet eine Wildcard, um über jedes Buch zu fächern und gibt[8.95, 8.99, 22.99]in Dokumentreihenfolge zurück.$.store.book[-1].titlenimmt das letzte Buch durch negativen Index:["The Lord of the Rings"].$.store.book[0:2].titlesliced die ersten zwei Bücher (End-exklusiv):["Sayings of the Century", "Moby Dick"].$..pricesteigt rekursiv ab, sammelt jedenpriceunterhalb der Wurzel einschließlich des Fahrrads:[8.95, 8.99, 22.99, 19.95].
Die letzte Abfrage ist diejenige, die Leute überrascht. Rekursiver Abstieg besucht den gesamten Teilbaum, nicht nur die erste Übereinstimmung, weshalb er richtig ist für "Finde jede id unabhängig von Verschachtelung" und falsch, wenn du einen einzelnen Knoten gemeint hast.
Wann dieses Tool seinen Wert beweist
- Einen spezifischen Wert aus einem tief verschachtelten Webhook-Payload (Stripe-Events, Shopify-Bestellungen, GitHub-Action-Kontexte) herausziehen, ohne einen Wegwerf-JS-Einzeiler zu schreiben.
- Snapshot-Tests erstellen, bei denen du behaupten möchtest "jede
idin diesem OpenAPI-Dokument ist ein String", zuerst als$..identworfen. - Einem Teamkollegen erklären, warum seine
$.users[*].email-Abfrage ein leeres Array zurückgibt, weil der eigentliche Schlüsselusersbei Tiefe 2 ist, nicht Tiefe 1. - Eine Liste von Dateipfaden aus einem Cloudflare-Pages-Build-Manifest, einer Vercel-Deployment-Antwort oder einem Kubernetes-
kubectl -o json-Dump extrahieren. - Den JSONPath skizzieren, den du in einen Datadog-Monitor, ein Logz.io-Alert oder einen Postman-Test zu setzen gedenkst, bevor du die Konfiguration überträgst.
- Überprüfen, dass ein Long-Tail-JSON-Dokument tatsächlich das Feld enthält, das du bei der Tiefe erwartest, die du angenommen hast, ohne Code zu instrumentieren.
Häufige Fallstricke und Randfälle
- Rekursiver Abstieg ist gierig.
$..priceauf einem Dokument mit sowohlstore.bicycle.priceals auchstore.book[*].pricegibt jede Übereinstimmung zurück, nicht die erste. Wenn du nur die Bücher möchtest, verankere mit$.store.book[*].price. - Slices sind End-exklusiv.
[0:2]gibt Elemente 0 und 1 zurück, nicht 0 bis 2 einschließlich. Das stimmt mit Python und der JSONPath-Referenz überein, verbrennt aber Entwickler, die an inklusive Bereiche gewöhnt sind. - Negative Indizes wrappen still.
[-1]ist das letzte Element,[-100]auf einem 5-Element-Array ist keine Übereinstimmung (kein Fehler). Plane für beide Verhaltensweisen, wenn du Pfade programmatisch generierst. - Punkt-Notation kann keine Schlüssel mit Punkten darin erreichen. Ein Schlüssel wörtlich namens
"file.json"benötigt Klammer-Notation:$['files']['file.json']. Punkt-Syntax würde ihn als verschachtelten Pfad parsen. - Wildcards auf Objekten iterieren Werte, keine Schlüssel.
$.headers.*gibt die Werte jedes Headers in Einfügungsreihenfolge zurück. Es gibt keinen Schlüssel-Introspektions-Operator in der JSONPath-Grammatik. - Filter-Ausdrücke werden nicht unterstützt. Wenn dein Pfad
?(...)enthält, wechsle zu einer reichhaltigeren Engine wiejsonpath-plus, JMESPath oder jq. Die Auslassung ist absichtlich.
JSONPath-Ursprünge und IETF RFC 9535
JSONPath wurde 2007 von Stefan Goessner als JSON-Analogon zu XPath skizziert. Die Referenzimplementierung war ein JavaScript-Snippet, das Seiten jahrelang ohne formale Spezifikation kopierten. Im Jahr 2024 veröffentlichte die IETF RFC 9535, das erste Standards-Track-JSONPath-Dokument, das Randfälle korrigiert (Unicode-Normalisierung, Leerzeichen-Behandlung, Slice-Semantik) und eine portable Test-Suite definiert. Die hier implementierte Grammatik ist die gemeinsame Teilmenge, auf die sich sowohl Goessner als auch RFC 9535 einigen; reichhaltigere Engines wie Burke Librarys jsonpath-plus, Javas Jayway und Pythons jsonpath-ng fügen Filter- und Script-Ausdrücke hinzu.
Alternativen und wann sie dieses Tool schlagen
Kommandozeilen-jq ist die richtige Wahl für Transformationen statt Extraktionen; es hat eine reichhaltigere Abfragesprache, unterstützt Streaming und läuft auf Gigabytes von Daten ohne den Browser-Speicherdruck. JMESPath (die --query-Flag des AWS CLI) ist eine andere, aber verwandte Grammatik mit stärkerer Filter- und Projektionsunterstützung; wenn du in aws-, az- oder gh-CLIs lebst, bevorzuge es. Innerhalb von Node deckt jsonpath-plus auf npm die Filter-Ausdrücke ab, die dieser Auswerter weglässt. JSON Pointer (RFC 6901) ist die richtige Wahl, wenn du nur einen einzelnen, vollständig angegebenen Pfad ohne Wildcards benötigst. Verwende diesen Auswerter, wenn du einen Pfad interaktiv im Browser entwerfen und überprüfen möchtest, keine andere Abfragesprache installieren oder erlernen möchtest und keine sensitiven Payloads in einen Remote-Dienst wie jsonpath.com einfügen möchtest.
Häufig gestellte Fragen
Welche JSONPath-Syntax implementiert dieses Tool?
Die gemeinsame Teilmenge, die die meisten Entwickler verwenden: <code>$</code> Wurzel, <code>.kind</code>, <code>['kind']</code>, <code>[N]</code>, <code>[-N]</code>, <code>[*]</code>, <code>[start:end]</code> exklusiver End-Slice und <code>..name</code> rekursiver Abstieg. Filter-Ausdrücke <code>[?(@.foo)]</code> und Script-Ausdrücke werden absichtlich weggelassen - eine reichhaltigere Engine wie jsonpath-plus ist die richtige Wahl, wenn du sie benötigst.
Warum werden Filter-Ausdrücke nicht unterstützt?
Filter-Ausdrücke fügen eine JavaScript-artige Prädikat-Engine und die damit verbundenen Sicherheitsfragen über nicht vertrauenswürdige Eingaben hinzu. Der hier beschriebene Auswerter ist ein reiner Walker über den Dokumentbaum, was den Umfang klein und die Angriffsfläche null hält. Für Prädikat-Filterung, leite das übereinstimmende Array durch einen separaten JS-Ausdruck auf deiner Seite oder verwende jsonpath-plus.
Lädt der Auswerter mein JSON irgendwo hoch?
Nein. Die gesamte Auswertung läuft innerhalb einer Preact-Komponente in deinem Browser. Es gibt keinen fetch-Aufruf oder Analytics-Beacon für das Dokument oder die Abfrage. Öffne den Netzwerk-Tab in DevTools, um dies zu bestätigen.
Wie verhält sich rekursiver Abstieg ($..name)?
Er sammelt jeden Wert, dessen Schlüssel exakt <code>name</code> ist, irgendwo unterhalb des aktuellen Knotens in Dokumentreihenfolge. <code>$..price</code> auf einem Buchladen-Dokument gibt den Preis jedes Buches und des Fahrrads in der Reihenfolge zurück, in der sie in der Quelle erscheinen.
Wie wird Index -1 bei einem leeren Array behandelt?
Die Ergebnismenge ist leer. Negative Indizes wrappen vom Ende: <code>[-1]</code> ist das letzte Element, <code>[-2]</code> ist das vorletzte. Wenn der resultierende Offset außerhalb des Arrays liegt, gibt der Auswerter keine Übereinstimmung aus, statt zu werfen.
Was ist der Unterschied zwischen Punkt- und Klammer-Notation?
Sie adressieren dieselben Knoten. <code>$.store.book</code> und <code>$['store']['book']</code> sind gleichwertig. Klammer-Notation ist obligatorisch, wenn ein Schlüssel einen Punkt, ein Leerzeichen oder andere Satzzeichen enthält, zum Beispiel <code>$['user-agent']</code> oder <code>$['file.json']</code>. Punkt-Notation ist kürzer für einfache Bezeichner-Schlüssel, daher mischen die meisten Entwickler beide in einem Pfad.
Bedeutet ein leeres Ergebnis, dass mein Pfad falsch ist?
Nicht unbedingt. Ein leeres Array ist ein gültiges, korrektes Ergebnis, wenn nichts übereinstimmt - zum Beispiel <code>$.users[*].email</code> auf einem Dokument ohne Benutzer. Die häufigste Ursache für ein unerwartetes leeres Ergebnis ist ein Off-by-One in der Verschachtelungstiefe oder ein Schlüssel-Tippfehler, also prüfe die Dokumentstruktur mit <code>$.*</code> oder <code>$..*</code>, um zu sehen, was adressierbar ist.
Wie funktionieren Slices mit einem Schritt?
<code>[start:end:step]</code> spiegelt Python. <code>[0:6:2]</code> nimmt Indizes 0, 2 und 4 aus dem Slice-Fenster; <code>end</code> bleibt exklusiv. Das Weglassen einer Komponente verwendet den Standard - <code>[::2]</code> ist jedes zweite Element vom Start, <code>[1:]</code> ist alles ab Index 1.
Kann ich dieselbe Abfrage gegen viele Dokumente ausführen?
Der Auswerter arbeitet ein Dokument auf einmal. Um über ein Verzeichnis zu stapeln, bestätige den Pfad hier, dann führe ihn mit <code>jq</code> oder einem Node-Skript mit <code>jsonpath-plus</code> aus. Das Tool ist am besten geeignet, den Pfad richtig zu machen, nicht für Hochvolumen-Extraktion.
Zeigt das Tool mir, von welchem Knoten jede Übereinstimmung kam?
Die Ausgabe ist das Array übereinstimmender Werte in Dokumentreihenfolge. Wenn du die Position jeder Übereinstimmung statt ihres Wertes benötigst, verwende eine JSON-Pointer-Engine oder den <a href="/tools/json-diff-viewer/">JSON-Diff-Viewer</a>, der strukturelle Position meldet.
Mehr Developer Tools
AI Token Counter
Count tokens for GPT-4o, Claude, and Gemini models instantly.
Open toolBase64 Encoder & Decoder
Encode UTF-8 text to Base64 online or decode Base64 back to UTF-8 and plain text. Runs in your browser with no upload.
Open toolBulk URL Encode / Decode
Encode or decode many URLs at once. Paste a newline-separated list and the tool processes each line in parallel, preserving order and blank lines.
Open toolchmod Calculator
Calculate and convert Unix file permission modes between octal and symbolic.
Open toolCode Screenshot
Create beautiful code snippet images with customizable themes.
Open toolColor Converter
Convert colors between HEX, RGB, HSL and CMYK formats.
Open tool