Evaluate a JSONPath expression against your JSON and see exactly what it matches — values and paths. Supports child/index/wildcard/slice steps, recursive descent and [?(@.field op value)] filters.
Show calculation steps
Processed privately in your browser — nothing you paste is uploaded, logged or stored.
Test expressions before they ship
A JSONPath that looks right and matches nothing is a classic time sink. Paste your document, type the expression, and see the actual matches instantly — values as a JSON array, and optionally the concrete path of every match. Iterate until the expression does exactly what you meant, then ship it to your test suite, monitoring rule or pipeline.
Worked example
Expression:
$.store.book[?(@.price < 30)].titleMatches:
[
"Clean Code",
"Deep Work"
]Supported syntax
- Dot and bracket children:
$.store.book,$['my key'] - Indexes incl. negative (
[-1]), wildcards ([*],.*), slices ([0:2]) - Recursive descent:
$..price - Filters:
[?(@.field op value)]with ==, !=, <, <=, >, >=, existence tests, and && / ||
This is the practical core of RFC 9535; script expressions and functions like length() are outside the subset and rejected with a clear message rather than mis-evaluated.
Common errors and fixes
- No matches — field names are case-sensitive; string literals in filters need quotes; numeric filters never match string values like “30”.
- “Could not parse the expression near…” — the message shows where parsing stopped; compare against the supported syntax above.
- Do not know the path to start from? — click the element in the JSONPath Finder and refine the copied path here.
How to use the JSONPath Tester
- Paste your JSON document.
- Enter a JSONPath expression — the default shows a filter example.
- Click "Run expression".
- Matched values appear as a JSON array; tick "Show matched paths" to see where each came from.
Frequently asked questions
What JSONPath syntax does the tester support?
The practical core of RFC 9535: dot and bracket children, array indexes (negative too), wildcards, slices, recursive descent (..name), and filters like [?(@.price < 30)] with ==, !=, <, <=, >, >= plus && and ||. Script expressions and functions like length() are not supported — the tool tells you when an expression uses them.
Why does my expression match nothing?
The three usual causes: field names are case-sensitive (@.Price ≠ @.price), string literals in filters need quotes (@.name == 'Asha'), and comparing across types never matches — a numeric filter will not match string values like "30".
What is the difference between .. and . ?
A single dot steps one level; double dots search ALL levels below. $..price finds every price anywhere in the document — powerful, but on big documents prefer anchored paths for precision.
How do I get an expression to test in the first place?
Paste the same document into the JSONPath Finder, click the element you care about, and bring the copied path here to refine with filters.