Query any JSON document with JSONPath — wildcards, recursive descent and filters — or click through the tree to get the exact path to any node.
Finding one value buried in an API response usually means scrolling a formatter until your eyes give out. JSON Path Finder replaces that with a query: type $.legs[?(@.days > 5)] and get back every matching node together with its concrete path. Both directions work, which is the useful part — you can also click any row in the document tree and the exact path to it lands in the query box.
The evaluator handles the JSONPath constructs people actually reach for: child access, array indexing including negative offsets, wildcards, slices, recursive descent at any depth, and filter expressions comparing a field against a literal. Everything runs on your own machine; no document is sent anywhere.
Press Load Sample and the editor fills with a freight manifest whose first line is "shipment": "MRD-88214". It carries six scalar fields and a legs array holding two objects, one per transport mode. Try these against it:
$.origin returns a single match, "Rotterdam", at path $.origin.$..days reaches into the array without you naming it and returns 2 matches: 21 at $.legs[0].days and 2 at $.legs[1].days.$.legs[?(@.days > 5)] keeps only the sea leg, since 21 is over the threshold and 2 is not. One match, at $.legs[0].$.* returns the 7 top-level values; $..* returns all 13 nodes in the document, which is a quick way to see its true size.$.legs or $['legs']. Bracket-quoted form is needed for keys holding a space, a dash or a dot.$.legs[0] for the first element, $.legs[-1] for the last.$.legs[*] or $.*, expanding every child of the current node.$.legs[0:2], with an optional step. A negative step walks backwards, so $.legs[::-1] yields the array reversed.$..mode finds that key at any depth, however deeply nested.[?(@.days > 5)] with ==, !=, <, <=, > or >=. Dropping the operator, as in [?(@.mode)], tests only that the field exists.Union syntax ([0,2]) and script expressions are not implemented, and neither is regex matching. A path that reaches for one is rejected rather than quietly returning nothing.
$.legs[-1] on a 2-element array and the result is labelled $.legs[1], not $.legs[-1]. Paths that come back are always concrete, so you can paste one into code and it will still point at the same node.@ names that specific mistake rather than returning an empty list.@.days > '5' compares a number against a string and matches nothing, because ordering is only applied when both sides share a type. Use @.days > 5 without quotes.246/100,000 characters
Supports .key, [0], [-1], [*], [1:3], ..key for any depth, and [?(@.field > 5)] filters.
$
{ 7 keys }object