JSON
Matches
When you need to pull just the values you want out of an API response, a config file, or a large JSON blob, this tool lets you write a JSONPath expression and evaluate it instantly. Paste your JSON, type an expression like `$.store.book[*].title`, `$..author`, or `$.items[?(@.price < 100)]`, and every match is listed with a normalized path such as `$['store']['book'][0]['title']`. The supported syntax covers the root `$`, child access `.key` and `['key']`, recursive descent `..`, the wildcard `*` / `[*]`, array indexes `[0]` and from-the-end `[-1]`, unions `[0,2]` / `['a','b']`, slices `[1:3]` / `[::2]`, and filters `[?(@.price < 10)]`. Inside a filter you can use comparisons (`==` `!=` `<` `<=` `>` `>=`), logical operators (`&&` `||`), and existence checks (`@.isbn`). If the expression or the JSON is invalid, it tells you which one is wrong and why, so you can fix the syntax as you go. Click "Copy" to grab all matched values as a JSON array. Because JSON so often carries API keys, personal data or production payloads, the entire evaluation runs inside your browser — nothing is uploaded, stored, or sent to a server. Great for sanity-checking an expression before you write the jq command or the code that uses it, or for validating the paths you put in documentation.
How to use
- Paste your JSON into the "JSON" box below (try "Sample" for an example).
- Type an expression like `$.store.book[*].title` into the "JSONPath" field. Filters `[?(@.price < 10)]`, the wildcard `*`, and recursive descent `..` all work.
- Matching values are listed with their paths. Click "Copy" to grab them as a JSON array. Nothing is sent anywhere.
FAQ
Is the JSON I paste uploaded anywhere?
No. Parsing and JSONPath evaluation all run in your browser with JavaScript. Your JSON is never uploaded, stored, or sent to a server, so it's safe to test data containing API keys, personal information or production payloads.
Which JSONPath syntax is supported?
The root `$`, child access `.key` and `['key']`, recursive descent `..`, the wildcard `*` / `[*]`, indexes `[0]` and from-the-end `[-1]`, unions `[0,2]` / `['a','b']`, slices `[1:3]` / `[::2]`, and filters `[?(...)]`. It covers the widely used core of JSONPath.
How do I write a filter ([?(...)])?
Reference the current item with `@` and compare, e.g. `$.book[?(@.price < 10)]`. Operators are `==` `!=` `<` `<=` `>` `>=`, logical `&&` and `||`, and `@.isbn` alone selects items where that key exists. Example: `$.book[?(@.price < 10 && @.author == 'Melville')]`.
What is recursive descent (..)?
An expression like `$..author` collects every `author` anywhere in the JSON, no matter how deeply nested. It's handy when you want all occurrences of a key without knowing exactly where they live.
How is this different from jq?
jq is a full language that also transforms and reshapes JSON, while this tool focuses on extracting values with a JSONPath expression. Use it to confirm an expression picks the right values before you write the jq command or the code, or to validate the paths in your docs. For formatting use json-format; for structural diffs use json-diff.
I get zero matches — why?
Check key names and capitalization, whether you're indexing into arrays correctly, and whether your filter is too strict. If the expression itself is invalid, it shows "JSONPath is not valid" with the reason. Zero matches means the expression is valid but nothing in your JSON matched it.