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
- 1Paste your JSON into the input panel - array, object, or nested
- 2Pick Extract mode: Values (default), Keys, Paths, or Key: value
- 3Toggle Trim to strip edge whitespace; Dedupe to drop duplicates
- 4Invalid JSON shows a status-bar error; fix the source to continue
- 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.
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.
{
"user": {
"name": "Alice",
"tags": ["admin", "editor"]
},
"count": 2
}
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 |