# What Is NDJSON (JSON Lines)? — One JSON Object per Line

Canonical: https://commareports.com/glossary/ndjson
Published: 2026-10-14

> NDJSON, also called JSON Lines or JSONL, stores one JSON value per line with no enclosing array. Why logs, BigQuery and Elasticsearch bulk loads use it, how it differs from a JSON array, and how to convert between the two.

# NDJSON (JSON Lines)

**NDJSON — newline-delimited JSON — is a text format with one complete
JSON value on each line.** No enclosing array, no commas between
records. The same convention ships as JSON Lines, with the extension
`.jsonl`.

```
{"id":1,"status":"passed","ms":412}
{"id":2,"status":"failed","ms":1290}
{"id":3,"status":"passed","ms":388}
```

The equivalent JSON is one array that must be read to the final `]`
before any of it is valid.

## Why it exists

| Need                         | JSON array                         | NDJSON                    |
| ---------------------------- | ---------------------------------- | ------------------------- |
| Process a 10 GB file         | Load it all, or a streaming parser | Read a line, parse a line |
| Append a record              | Rewrite the closing `]`            | Write one line            |
| Survive a truncated write    | Whole file invalid                 | Lose the last line        |
| Split across workers         | Hard                               | `split -l`                |
| `grep` / `wc -l` / `tail -f` | Meaningless                        | One record per match      |

That is why it is the default shape for structured logs, Elasticsearch's
`_bulk` API, BigQuery and Snowflake loads, OpenAI-style batch and
fine-tuning files, and most streaming HTTP responses.

## The rules

- One JSON value per line. Usually an object, but any value is legal.
- No raw newlines inside a value — they must be escaped as `\n`, which
  every JSON serialiser already does when not pretty-printing.
- UTF-8. A [byte order mark](/glossary/byte-order-mark) at the start
  breaks the first line in strict parsers.
- Blank lines are commonly skipped, but not every reader tolerates them.

## Converting

- **NDJSON → JSON array:** `jq -s . file.ndjson`, or in JavaScript
  `text.split("\n").filter(Boolean).map(JSON.parse)`.
- **JSON array → NDJSON:** `jq -c '.[]' file.json`.
- **CSV → NDJSON:** the [CSV to JSON converter](/tools/csv-to-json) has
  an NDJSON output shape.
- **NDJSON → table:** [JSON to HTML table](/tools/json-to-html-table) and
  [JSON to CSV](/tools/json-to-csv) both accept NDJSON input when the
  text isn't a single JSON document.

## Making it readable

NDJSON is built for programs. When a person needs to look at the
records — a failed batch, a slice of logs — a rendered table they can
sort and comment on beats a 4,000-column-wide line in a terminal. Paste
the lines into [JSON to HTML table](/tools/json-to-html-table) and share
the result as a link.

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited
revision history.

**[Turn NDJSON into a shareable table →](/tools/json-to-html-table)**

### Related

- [Byte order mark](/glossary/byte-order-mark) · [CSV injection](/glossary/csv-injection) · [Mojibake](/glossary/mojibake)
- [CSV to JSON](/tools/csv-to-json) · [JSON formatter](/tools/json-formatter)
- [Glossary](/glossary)
