🛤️ JSONPath Tester
Query a JSON document with a simplified path syntax: $.store.books[0].title,
$.store.books[*].price, or $..price for a recursive search. Supports the
common subset of JSONPath — not the full spec.
The four things a path can contain
A leading $ is optional, and the rest is read as a sequence of steps.
Each step filters the current set of nodes, so a wildcard early on multiplies the
matches that follow.
.key a named child $.store.books
[0] one array element $.store.books[0].title -> Dune
[*] every element, or $.store.books[*].title -> Dune, Foundation
every value of an object
..key that key at any depth $..price -> 12.99, 9.99
Key names may contain letters, digits and underscores. Anything else in the path - a stray space, a hyphen, an unclosed bracket - stops the parse with the offending fragment quoted back at you, while a path that is valid but matches nothing simply reports 0 found.
The parts of JSONPath that are missing
- No filters.
[?(@.price < 10)], the expression people most often want, is not implemented, and neither are slices such as[0:2]or unions such as[0,1]. - No quoted keys.
$['order-id']and$.*are both rejected, so a key with a hyphen or a dot in it cannot be reached. - Results are values, not paths. Scalars print bare and objects print as compact JSON, so a string match appears without its quotes.
Frequently asked questions
What is the difference between $.store.price and $..price?
The first walks one exact route and matches only a price directly under store. The second searches the whole document and returns every price at any depth, in document order - handy when you do not yet know the shape of the response.
Does this support filter expressions like [?(@.price < 10)]?
No. This is the common subset - child, index, wildcard and recursive descent. For filters, comparisons and functions you need a full implementation of RFC 9535, the JSONPath standard published in 2024.
Why does my path return 0 matches when the key is clearly there?
Usually a missing array step: $.books.title finds nothing when books is
a list, because you need $.books[*].title. Key names are also
case-sensitive, and an index that is past the end of the array matches nothing rather
than erroring.