Parse JSON into a flat list

Paste any JSON - array, object, nested structure - and get a flat, one-per-line list back. Pick what you want out: every leaf value, every key, every dotted path, or `key: value` pairs. The walker recurses through arrays and objects without you having to flatten them first.

Input
Ready
Output
Live

A recursive JSON extractor

The parser walks the whole structure depth-first. Arrays are iterated by index; objects by key. Leaf values (strings, numbers, booleans, null) are captured at the position where they sit in the tree. Extract mode decides what that capture actually produces - just the leaf values (default), every key encountered, dotted paths reaching every leaf, or combined `key: value` rows.

Extract: Values emits the stringified leaf values only, ignoring keys entirely. Keys emits every object key as the walker sees them (so nested keys appear too). Paths emits the full dotted path to every leaf - `user.name`, `user.tags[0]`, `count`. Key: value is the most common debug format - object keys paired with their immediate scalar value.

Standard post-processing runs after extraction: Trim strips whitespace from each line, Dedupe removes duplicates (case-insensitive). Invalid JSON returns a short error message in the status bar rather than producing partial output - that way the difference between "no items" and "broken source" stays visible.

How to use parse json into a flat list

  1. 1Paste your JSON into the input panel - array, object, or nested
  2. 2Pick Extract mode: Values (default), Keys, Paths, or Key: value
  3. 3Toggle Trim to strip edge whitespace; Dedupe to drop duplicates
  4. 4Invalid JSON shows a status-bar error; fix the source to continue
  5. 5Copy the list or feed it to another tool - use convert-list-to-JSON to round-trip

Keyboard shortcuts

Drive ListShift without touching the mouse.

Shortcut Action
Ctrl ZUndo last input change
Ctrl Shift ZRedo
Ctrl Shift EnterToggle fullscreen focus on the editor
EscExit fullscreen
Ctrl KOpen the command palette to jump to any tool
Ctrl SSave current pipeline draft Plus
Ctrl PRun a saved pipeline Plus

What this extractor actually does

Four extract modes, full recursive walk, strict JSON parsing.

Uses the browser's native JSON parser

Input is passed to `JSON.parse` - strict, spec-compliant. JSON5 features (unquoted keys, trailing commas, comments) are rejected. If you have JSON5 input, convert it to strict JSON first.

Values mode: every leaf, ignoring keys

Walks into every array and object and emits the stringified leaf values only. Objects contribute their value members; their keys are skipped. Useful when you just want "everything storable as a string" flattened into one list.

Keys mode: every key at every depth

Emits every object key the walker encounters. Arrays contribute no keys (just their contained objects' keys). Good for auditing what field names exist in a document.

Paths mode: dotted + indexed paths to every leaf

Emits `user.name`, `user.tags[0]`, `user.tags[1]`, `count` - every leaf location as a JMESPath-lite string. Useful for producing a field map of an unfamiliar API response.

Key: value mode - readable key/value rows

For every scalar leaf, emits `key: value` where key is the immediate parent object key. Nested values still traverse deeper, so the output still covers the full tree.

Worked example

Values mode walks the nested user object and the tags array.

Input
{
  "user": {
    "name": "Alice",
    "tags": ["admin", "editor"]
  },
  "count": 2
}
Output
Alice
admin
editor
2

Settings reference

How each extract mode + option shapes the output using the sample above.

Setting What it does Effect on the sample
Extract: Values (default) Stringified leaf values only `Alice`, `admin`, `editor`, `2`
Extract: Keys Every object key encountered during the walk `user`, `name`, `tags`, `count`
Extract: Paths Dotted + indexed path to every leaf `user.name`, `user.tags[0]`, `user.tags[1]`, `count`
Extract: Key: value Scalar leaves paired with their immediate key `name: Alice`, `count: 2` (array entries excluded - no key)
Trim: on (default) Strips leading/trailing whitespace from each output line No visible change on the sample
Dedupe: on Drops duplicate values (case-insensitive) No duplicates in sample - no change

FAQ

What happens if my input is not valid JSON?
The tool catches the parser error and shows it in the status bar, without producing any output. JSON must be strict - unquoted keys, trailing commas, single quotes, and JavaScript-style comments are rejected by `JSON.parse`. Convert JSON5 or JS-object literals to strict JSON first.
Does Key: value mode skip array entries?
Yes. An array entry has no key, so the `key: value` form has nothing to put on the left side. The walker still descends into arrays for nested objects, but scalar array entries themselves are omitted from Key: value output. Use Values mode if you need them.
Does the tool recurse into deeply nested structures?
Yes - the walker is fully recursive with no depth limit. A 10-level-deep object flattens into the same kind of list as a flat one. Very deep structures may hit the browser's stack limit (~10,000 levels), but that is far beyond any realistic API response.
What is the difference between Paths mode and Key: value mode?
Paths shows where a leaf lives in the tree (`user.tags[0]`) - useful for building a field map. Key: value shows the leaf paired with its immediate parent key (`name: Alice`) - useful as a debug listing. Pick based on whether you want the full address or the local label.
Can I build JSON from a list?
Yes, use convert-list-to-JSON - it wraps each line in a quoted string and emits a JSON array. The pair is not a perfect round trip because this tool descends into structures, but flat input round-trips cleanly.