JSONPath Tester
Evaluate a JSONPath expression against your JSON and see every match update live as you type — wildcards, recursive descent, array slices, and filter expressions (e.g. [?(@.price>10)]) are all supported. Each result shows both its resolved, unambiguous path and its value, using jsonpath-plus, a widely-used JSONPath implementation. Paste your JSON directly or upload a .json file. Runs entirely client-side — nothing is uploaded.
| Path | Value |
|---|---|
| $['store']['book'][0]['title'] | "Sayings of the Century" |
| $['store']['book'][1]['title'] | "Sword of Honour" |
| $['store']['book'][2]['title'] | "The Lord of the Rings" |
About this tool
This tool evaluates a JSONPath expression against your JSON and shows every match, live, as you type. JSONPath is to JSON what XPath is to XML — a compact query syntax for reaching into nested structures without writing a loop: $.store.book[*].title selects every book's title, $.store.book[?(@.price>10)] filters to books over a given price, and $..title recursively finds every title field at any depth. Each result shows both its resolved, unambiguous path (so $.store.book[0].title normalizes to $['store']['book'][0]['title']) and its value, which is useful for confirming exactly which element in an array a wildcard or filter actually matched. It runs entirely client-side using jsonpath-plus, a widely-used JSONPath implementation — nothing you paste or upload is ever sent anywhere.
What you can do
- Query JSON with a JSONPath expression and see every match live
- Paste your JSON directly, or upload a .json file
- Wildcards, recursive descent, array slices, and filter expressions all supported
- Nothing is uploaded — every query runs locally in your browser
How to use
Step 1
Add your JSON
Paste it directly, or upload a .json file.
Step 2
Write a JSONPath expression
Results update live as you type — each match shows its resolved path and value.
Step 3
Copy the matched values
Copy just the matched values as a JSON array.
Example
Against this JSON:
JSON
{
"store": {
"book": [
{ "title": "A", "price": 10 },
{ "title": "B", "price": 20 }
]
}
}JSONPath
$.store.book[?(@.price>15)].title
matches just "B" — the filter expression @.price>15 runs against each array element before .title is read off it.
How your data is handled
This tool is labeled 🟢 Browser: your JSON and JSONPath expression are evaluated directly in your browser using the jsonpath-plus library — nothing is uploaded to a server, and nothing about it is retained once you leave the page.
Frequently asked questions
What does $ mean at the start of an expression?+
It refers to the root of the JSON document — every JSONPath expression starts from there. $.store.book means "from the root, go into store, then book".
What's the difference between . and ..?+
A single dot (.store) steps into one named property. A double dot ($..title) is recursive descent — it searches every level of the document for a title field, however deeply nested.
How do filter expressions work?+
[?(@.price>10)] keeps only array elements where the condition is true — @ refers to the current element being tested. You can combine conditions with && and ||, e.g. [?(@.price>10 && @.category=="fiction")].
Why is my results table empty with no error?+
The expression is valid but nothing in your JSON matched it — check the field names and structure against what's actually in your document (JSON is case-sensitive).
Can I upload a file instead of pasting?+
Yes — the file picker next to the JSON box accepts a .json file directly.
Is my data uploaded anywhere?+
No — both your JSON and your JSONPath expression are evaluated directly in your browser using the jsonpath-plus library. Nothing here ever leaves your device.