Tools · NDJSON

NDJSON viewer

One JSON value per line. A broken line is a broken line, not a broken file — it is counted, shown, and the other lines still read.

no signup · runs entirely in your browser · ⌘V works anywhere on this page
See it done · 8 s
Read JSON lines as records — A JSON-lines log opens as records at once; Records gives the list the width, a double-click opens a record’s fields beside it. · 8 s

What you get

  • Reads the sample as 5 lines, 1 of them broken — the verdict says so, and “broken only” shows just that one
  • Level chips — info · warn · error — from the level field, several at once, each with its count
  • A filter box that takes words, field=value, field!=value, -word and /regex/ — keys and values offered as you type, the match count measured
  • A record’s fields in a panel; a field holding packed JSON opens as nested rows
  • Convert the rows to CSV, a Markdown table, YAML or a JSON array; Compare two runs by record

What it will not do

  • Stream from a URL or tail a file — the text you paste or drop is the text it reads.
  • Fix a broken line without asking. Broken rows are grouped by cause and fixed by the group when you say.
  • Upload the file. It is read in your tab, and a large input is stored in this browser only.

What a line can be

A record

One JSON value per line; its keys become the columns.

A broken line

Counted, shown as the text it is, marked “won’t parse”. The other lines still read.

A level

A level field becomes chips — info · warn · error — each with its count, several at once.

words

The filter box matches the words anywhere in a record.

field=value

One field, one exact value — the keys and their values are offered as you type.

field!=value

The same field, with that value left out.

-word

The lines without the word.

/regex/

A regular expression over the whole line.

broken only

Only the lines that did not parse.

The sample

What the first sample opens — a real file, not an illustration written for this page.

checkout-api.ndjson
{"ts":"2026-04-21T14:32:08.412Z","level":"info","msg":"stripe.charge.completed","amount":17054,"order_id":"ord_8f3aa19c4d"}
{"ts":"2026-04-21T14:32:07.940Z","level":"warn","msg":"retry.scheduled","attempt":2,"backoff_ms":400}
{"ts":"2026-04-21T14:32:07.813Z","level":"error","msg":"stripe.webhook.signature_invalid","payload":"{\"event\":\"charge.succeeded\",\"id\":\"evt_1PZ3xK\"}"}
{"ts":"2026-04-21T14:32:07.512Z","level":"info","msg":"cart.items.priced","items":2,"total":14900
{"ts":"2026-04-21T14:32:06.301Z","level":"info","msg":"session.token.issued","ttl":3600}

in VS Code

The status bar counts the rows and the broken ones; Read as records opens them beside the text, each broken record fixed alone.

unstringify for VS Code14-day trial · Free and Pro

Questions

What is the difference between NDJSON and JSON Lines?

None that matters here: both are one JSON value per line, newline-separated. .ndjson, .jsonl and .log files open the same way.

Can I convert NDJSON to a JSON array?

Yes — Convert writes the rows as a JSON array, or as CSV, YAML, XML or a Markdown table.

Can I see only the errors?

Yes. The level chips filter by the level field, and “broken only” shows the lines that did not parse.

Does a broken line stop the file?

No. Each line parses on its own; the broken one is counted and listed, and the others read.

Try it on the file that broke your afternoon.

free · no signup