NDJSON Complete Gids: Newline Delimited JSON Uitgelegd
Een uitgebreide gids over Newline Delimited JSON (NDJSON). Leer de specificatie, het MIME-type, hoe je NDJSON leest en schrijft in Python, Node.js en de opdrachtregel, het gebruik in streaming HTTP API's, en de relatie met JSONL.
Laatst bijgewerkt: februari 2026
Wat Is NDJSON?
NDJSON staat voor Newline Delimited JSON. Het is een tekstgebaseerd gegevensformaat waarbij elke regel precies één geldige JSON-waarde bevat, gescheiden door een newline-teken (\n). Het formaat is ontworpen voor streaming en het verwerken van grote datasets zonder het hele bestand in het geheugen te laden. In tegenstelling tot een standaard JSON-bestand dat alles in een enkele array of object wikkelt, laat NDJSON je records één voor één lezen, schrijven en verwerken.
De NDJSON-specificatie wordt gehost op github.com/ndjson/ndjson-spec. Het is gemaakt om een patroon te formaliseren dat al gebruikelijk was geworden bij logverzending, datapipelines en HTTP-streaming API's. Elke regel is op zichzelf staand: als één regel ongeldige JSON bevat, kunnen andere regels nog steeds succesvol worden geparseerd. Dit maakt NDJSON fouttolerant en zeer geschikt voor append-only workflows zoals applicatielogs, eventstreams en incrementele gegevensexports.
{"id":1,"event":"page_view","url":"/home"}{"id":2,"event":"click","url":"/pricing"}{"id":3,"event":"signup","url":"/register"}
De NDJSON-specificatie
De officiële NDJSON-specificatie op github.com/ndjson/ndjson-spec is opzettelijk minimaal. Het definieert een eenvoudige conventie voor het serialiseren van meerdere JSON-waarden in een enkele tekststroom. De kernregels zijn eenvoudig:
De specificatie vermijdt bewust het toevoegen van headers, metadata of schema-informatie aan het formaat. Dit houdt NDJSON zo eenvoudig mogelijk en compatibel met standaard Unix-tekstverwerkingstools. Elke geldige JSON-waarde is toegestaan op elke regel, hoewel in de praktijk de meeste NDJSON-bestanden JSON-objecten bevatten met een consistente set sleutels.
- Elke regel MOET precies één geldige JSON-waarde bevatten (object, array, string, nummer, boolean of null).
- Regels worden gescheiden door het newline-teken '\n' (U+000A). De carriage return '\r' (U+000D) mag vóór '\n' verschijnen maar is niet vereist.
- Een afsluitende newline na de laatste JSON-waarde is toegestaan maar niet vereist.
- Elke JSON-waarde mag geen ongeëscapete newline-tekens bevatten binnen de waarde zelf.
Omdat de regels minimaal zijn, is NDJSON eenvoudig te genereren vanuit elke programmeertaal die een JSON-serializer heeft. Serialiseer gewoon elk record, voeg een newline toe en schrijf het naar de uitvoer. Geen sluitende haakjes, geen achterliggende komma's, geen omsluitende arraystructuur om je zorgen over te maken.
NDJSON vs JSON vs JSONL
NDJSON, JSON en JSONL hebben elk een andere structuur. Standaard JSON codeert een enkele waarde (meestal een array of object). JSONL en NDJSON slaan allebei één JSON-waarde per regel op en zijn functioneel identiek aan elkaar. De onderstaande tabel belicht de belangrijkste verschillen tussen alle drie de formaten.
| Kenmerk | JSON | JSONL | NDJSON |
|---|---|---|---|
| Volledige Naam | JavaScript Object Notation | JSON Lines | Newline Delimited JSON |
| Bestandsextensie | .json | .jsonl | .ndjson |
| MIME-type | application/json | application/jsonl (onofficieel) | application/x-ndjson |
| Specificatie | RFC 8259 (IETF-standaard) | jsonlines.org (community) | github.com/ndjson/ndjson-spec (community) |
| Regelscheidingsteken | N.v.t. (enkele waarde) | \n (newline) | \n (newline) |
| Afsluitende Newline | N.v.t. | Aanbevolen | Optioneel |
| Streamingvriendelijk | Nee (moet volledig document parseren) | Ja (regel voor regel) | Ja (regel voor regel) |
NDJSON MIME-type: application/x-ndjson
Het geregistreerde MIME-type voor NDJSON is application/x-ndjson. Dit content type wordt gebruikt in HTTP-headers om aan te geven dat de response body newline-gescheiden JSON-gegevens bevat. Veel streaming API's, waaronder de GitHub API, Docker Registry API en Elasticsearch bulk API, gebruiken dit MIME-type om NDJSON-responses te leveren.
Content-Type: application/x-ndjson# Example: curl a streaming APIcurl -H "Accept: application/x-ndjson" https://api.example.com/events/stream# Example: Express.js responseres.setHeader('Content-Type', 'application/x-ndjson');res.write(JSON.stringify(record) + '\n');
Sommige API's accepteren ook application/json-seq (RFC 7464) of text/plain als alternatieven. Echter, application/x-ndjson is het meest wijdverbreide MIME-type voor newline-gescheiden JSON-streams. Wanneer je een nieuwe API bouwt die JSON-records streamt, gebruik dan application/x-ndjson voor maximale compatibiliteit.
NDJSON Lezen en Schrijven
Werken met NDJSON is eenvoudig in elke taal die JSON ondersteunt. Hieronder staan praktische voorbeelden voor Python, Node.js en de opdrachtregel.
Python's ingebouwde json-module verwerkt NDJSON op natuurlijke wijze. Lees regels uit een bestand, parseer elke regel met json.loads en schrijf met json.dumps. Voor grote bestanden gebruikt deze regel-voor-regel aanpak constant geheugen.
guide-ndjson-complete-guide.ndjsonGuide.readWrite.python.code
In Node.js gebruik je de readline-module met fs.createReadStream om NDJSON-bestanden efficiënt te parseren. De stream verwerkt één regel tegelijk, waardoor het geheugengebruik laag blijft ongeacht de bestandsgrootte.
import { createReadStream, writeFileSync } from 'node:fs';import { createInterface } from 'node:readline';// Read NDJSONasync function readNdjson(filePath) {const records = [];const rl = createInterface({input: createReadStream(filePath, 'utf-8'),crlfDelay: Infinity,});for await (const line of rl) {const trimmed = line.trim();if (trimmed) records.push(JSON.parse(trimmed));}return records;}// Write NDJSONconst data = [{ id: 1, event: 'page_view' },{ id: 2, event: 'click' },];const ndjson = data.map(r => JSON.stringify(r)).join('\n') + '\n';writeFileSync('output.ndjson', ndjson, 'utf-8');
De opdrachtregeltool jq begrijpt NDJSON-invoer van nature. Gebruik de --slurp-vlag om alle records in een array te verzamelen, of verwerk elk record individueel zonder vlag.
# Print each record (jq reads NDJSON by default)jq '.' data.ndjson# Filter records where event is "click"jq 'select(.event == "click")' data.ndjson# Extract specific fieldsjq {id, url} data.ndjson# Count total recordsjq -s 'length' data.ndjson# Convert NDJSON to a JSON arrayjq -s '.' data.ndjson > data.json# Convert a JSON array back to NDJSONjq -c '.[]' data.json > data.ndjson
NDJSON in HTTP Streaming API's
NDJSON is de de facto standaard voor HTTP-streaming API's die realtime gegevens leveren. Wanneer een server een NDJSON-response verstuurt, kan de client beginnen met het verwerken van het eerste record zodra het binnenkomt, zonder te wachten tot de volledige response compleet is. Dit is sneller en geheugenefficiënter dan het retourneren van een grote JSON-array.
Populaire diensten die NDJSON-streaming gebruiken zijn Docker Registry (image layer events), Elasticsearch (bulkoperaties), Apache CouchDB (changes feed) en veel moderne event-driven API's. Het patroon werkt goed met Server-Sent Events-alternatieven, realtime log-tailing en progressief laden van gegevens in webapplicaties.
import express from 'express';const app = express();app.get('/api/events/stream', (req, res) => {res.setHeader('Content-Type', 'application/x-ndjson');res.setHeader('Transfer-Encoding', 'chunked');// Simulate streaming eventslet id = 0;const interval = setInterval(() => {id++;const event = {id,type: 'heartbeat',timestamp: new Date().toISOString(),};res.write(JSON.stringify(event) + '\n');if (id >= 100) {clearInterval(interval);res.end();}}, 100);req.on('close', () => clearInterval(interval));});app.listen(3000);
async function* readNdjsonStream(url) {const response = await fetch(url, {headers: { 'Accept': 'application/x-ndjson' },});const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();let buffer = '';while (true) {const { done, value } = await reader.read();if (done) break;buffer += value;const lines = buffer.split('\n');buffer = lines.pop();for (const line of lines) {if (line.trim()) yield JSON.parse(line);}}if (buffer.trim()) yield JSON.parse(buffer);}// Usagefor await (const event of readNdjsonStream('/api/events/stream')) {console.log('Received:', event);}
NDJSON Ecosysteemtools
Een groeiend ecosysteem van opdrachtregeltools en bibliotheken ondersteunt NDJSON native. Deze tools laten je NDJSON-gegevens filteren, transformeren en analyseren zonder aangepaste code te schrijven.
jq
Essentieeljq is de meest populaire opdrachtregelprocessor voor JSON. Het leest standaard NDJSON (één JSON-waarde per regel) en ondersteunt filteren, mappen, groeperen en herformatteren. Gebruik jq -c voor compacte uitvoer en jq -s om alle records in een array te slurpen.
ndjson-cli
CLIndjson-cli is een verzameling Unix-stijl commando's voor het manipuleren van NDJSON-streams: ndjson-filter, ndjson-map, ndjson-reduce, ndjson-sort en ndjson-join. Elk commando leest van stdin en schrijft naar stdout, waardoor ze composeerbaar zijn met pipes.
ndjson (npm)
Node.jsHet ndjson npm-pakket biedt streaming NDJSON-parsers en serializers voor Node.js. Het stelt ndjson.parse() en ndjson.stringify() transform streams beschikbaar die direct integreren in Node.js stream-pipelines voor gegevensverwerking met hoge doorvoer.
NDJSON en JSONL: Interoperabiliteit
NDJSON en JSONL (JSON Lines) zijn functioneel identieke formaten. Beide slaan één JSON-waarde per regel op, gescheiden door newline-tekens. Een bestand dat geldig NDJSON is, is ook geldig JSONL, en vice versa. Je kunt een .ndjson-bestand hernoemen naar .jsonl (of andersom) zonder een enkele byte inhoud te wijzigen, en elke tool die het ene formaat leest, zal het andere ook lezen.
De enige verschillen zijn cosmetisch: NDJSON komt van github.com/ndjson/ndjson-spec en gebruikt de .ndjson-extensie met het application/x-ndjson MIME-type, terwijl JSONL van jsonlines.org komt en de .jsonl-extensie gebruikt. In de praktijk behandelen de meeste ontwikkelaars de twee namen als synoniemen. Als je project al JSONL gebruikt, is er geen reden om naar NDJSON te migreren, en als een bibliotheek zegt NDJSON te ondersteunen, werkt het zonder enige wijziging met je .jsonl-bestanden.
Probeer Onze Gratis NDJSON/JSONL-tools
Werk met NDJSON- en JSONL-bestanden direct in je browser. Alle verwerking gebeurt lokaal, zodat je gegevens privé blijven.