NDJSON Komplettanleitung: Newline Delimited JSON erklart
Eine umfassende Anleitung zu Newline Delimited JSON (NDJSON). Erfahren Sie mehr uber die Spezifikation, den MIME-Typ, das Lesen und Schreiben von NDJSON in Python, Node.js und der Kommandozeile, die Verwendung in Streaming-HTTP-APIs und die Beziehung zu JSONL.
Zuletzt aktualisiert: Februar 2026
Was ist NDJSON?
NDJSON steht fur Newline Delimited JSON. Es ist ein textbasiertes Datenformat, bei dem jede Zeile genau einen gultigen JSON-Wert enthalt, getrennt durch ein Zeilenumbruchzeichen (\n). Das Format wurde fur das Streaming und die Verarbeitung grosser Datensatze entwickelt, ohne die gesamte Datei in den Speicher laden zu mussen. Im Gegensatz zu einer Standard-JSON-Datei, die alles in ein einzelnes Array oder Objekt einschliesst, ermoglicht NDJSON das Lesen, Schreiben und Verarbeiten von Datensatzen einzeln.
Die NDJSON-Spezifikation wird auf github.com/ndjson/ndjson-spec gehostet. Sie wurde erstellt, um ein Muster zu formalisieren, das bereits in Log-Shipping, Datenpipelines und HTTP-Streaming-APIs ublich geworden war. Jede Zeile ist eigenstandig: Wenn eine Zeile ungultiges JSON enthalt, konnen andere Zeilen trotzdem erfolgreich geparst werden. Dies macht NDJSON fehlertolerant und geeignet fur Append-Only-Workflows wie Anwendungsprotokolle, Event-Streams und inkrementelle Datenexporte.
{"id":1,"event":"page_view","url":"/home"}{"id":2,"event":"click","url":"/pricing"}{"id":3,"event":"signup","url":"/register"}
Die NDJSON-Spezifikation
Die offizielle NDJSON-Spezifikation auf github.com/ndjson/ndjson-spec ist absichtlich minimal. Sie definiert eine einfache Konvention fur die Serialisierung mehrerer JSON-Werte in einem einzigen Textstrom. Die Kernregeln sind unkompliziert:
Die Spezifikation vermeidet bewusst das Hinzufugen von Headern, Metadaten oder Schema-Informationen zum Format. Dies halt NDJSON so einfach wie moglich und kompatibel mit Standard-Unix-Textverarbeitungstools. Jeder gultige JSON-Wert ist auf jeder Zeile erlaubt, obwohl in der Praxis die meisten NDJSON-Dateien JSON-Objekte mit einem konsistenten Satz von Schlusseln enthalten.
- Jede Zeile MUSS genau einen gultigen JSON-Wert enthalten (Objekt, Array, String, Zahl, Boolean oder null).
- Zeilen werden durch das Zeilenumbruchzeichen '\n' (U+000A) getrennt. Das Wagenrucklaufzeichen '\r' (U+000D) darf vor '\n' erscheinen, ist aber nicht erforderlich.
- Ein abschliessender Zeilenumbruch nach dem letzten JSON-Wert ist erlaubt, aber nicht erforderlich.
- Jeder JSON-Wert darf keine unmaskierten Zeilenumbruchzeichen innerhalb des Werts selbst enthalten.
Da die Regeln minimal sind, ist NDJSON leicht aus jeder Programmiersprache zu generieren, die uber einen JSON-Serialisierer verfugt. Serialisieren Sie einfach jeden Datensatz, fugen Sie einen Zeilenumbruch hinzu und schreiben Sie ihn in die Ausgabe. Keine schliessenden Klammern, keine abschliessenden Kommas, keine umschliessende Array-Struktur, um die Sie sich kummern mussen.
NDJSON vs JSON vs JSONL
NDJSON, JSON und JSONL haben jeweils eine unterschiedliche Struktur. Standard-JSON kodiert einen einzelnen Wert (normalerweise ein Array oder Objekt). JSONL und NDJSON speichern beide einen JSON-Wert pro Zeile und sind funktional identisch zueinander. Die folgende Tabelle zeigt die wichtigsten Unterschiede zwischen allen drei Formaten.
| Eigenschaft | JSON | JSONL | NDJSON |
|---|---|---|---|
| Vollstandiger Name | JavaScript Object Notation | JSON Lines | Newline Delimited JSON |
| Dateierweiterung | .json | .jsonl | .ndjson |
| MIME-Typ | application/json | application/jsonl (inoffiziell) | application/x-ndjson |
| Spezifikation | RFC 8259 (IETF-Standard) | jsonlines.org (Community) | github.com/ndjson/ndjson-spec (Community) |
| Zeilentrenner | N/A (einzelner Wert) | \n (Zeilenumbruch) | \n (Zeilenumbruch) |
| Abschliessender Zeilenumbruch | N/A | Empfohlen | Optional |
| Stream-tauglich | Nein (gesamtes Dokument muss geparst werden) | Ja (zeilenweise) | Ja (zeilenweise) |
NDJSON-MIME-Typ: application/x-ndjson
Der registrierte MIME-Typ fur NDJSON ist application/x-ndjson. Dieser Content-Typ wird in HTTP-Headern verwendet, um anzuzeigen, dass der Antwortkorper Newline-Delimited-JSON-Daten enthalt. Viele Streaming-APIs, darunter die GitHub-API, die Docker-Registry-API und die Elasticsearch-Bulk-API, verwenden diesen MIME-Typ, um NDJSON-Antworten zu liefern.
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');
Einige APIs akzeptieren auch application/json-seq (RFC 7464) oder text/plain als Alternativen. Allerdings ist application/x-ndjson der am weitesten verbreitete MIME-Typ fur Newline-Delimited-JSON-Streams. Wenn Sie eine neue API erstellen, die JSON-Datensatze streamt, verwenden Sie application/x-ndjson fur maximale Kompatibilitat.
NDJSON lesen und schreiben
Die Arbeit mit NDJSON ist in jeder Sprache unkompliziert, die JSON unterstutzt. Nachfolgend finden Sie praktische Beispiele fur Python, Node.js und die Kommandozeile.
Pythons integriertes json-Modul verarbeitet NDJSON naturlich. Lesen Sie Zeilen aus einer Datei, parsen Sie jede mit json.loads und schreiben Sie mit json.dumps. Fur grosse Dateien verwendet dieser zeilenweise Ansatz konstanten Speicher.
guide-ndjson-complete-guide.ndjsonGuide.readWrite.python.code
In Node.js verwenden Sie das readline-Modul mit fs.createReadStream, um NDJSON-Dateien effizient zu parsen. Der Stream verarbeitet eine Zeile nach der anderen und halt den Speicherverbrauch unabhangig von der Dateigrosse niedrig.
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');
Das Kommandozeilentool jq versteht NDJSON-Eingaben nativ. Verwenden Sie das --slurp-Flag, um alle Datensatze in einem Array zu sammeln, oder verarbeiten Sie jeden Datensatz einzeln ohne Flag.
# 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-APIs
NDJSON ist der De-facto-Standard fur HTTP-Streaming-APIs, die Echtzeitdaten liefern. Wenn ein Server eine NDJSON-Antwort sendet, kann der Client mit der Verarbeitung des ersten Datensatzes beginnen, sobald er eintrifft, ohne auf die vollstandige Antwort zu warten. Dies ist schneller und speichereffizienter als die Ruckgabe eines grossen JSON-Arrays.
Beliebte Dienste, die NDJSON-Streaming verwenden, sind die Docker Registry (Image-Layer-Events), Elasticsearch (Bulk-Operationen), Apache CouchDB (Changes-Feed) und viele moderne ereignisgesteuerte APIs. Das Muster funktioniert gut mit Server-Sent-Events-Alternativen, Echtzeit-Log-Tailing und progressivem Datenladen in Webanwendungen.
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-Okosystem-Tools
Ein wachsendes Okosystem von Kommandozeilen-Tools und Bibliotheken unterstutzt NDJSON nativ. Diese Tools ermoglichen es Ihnen, NDJSON-Daten zu filtern, transformieren und analysieren, ohne benutzerdefinierten Code schreiben zu mussen.
jq
Unverzichtbarjq ist der beliebteste Kommandozeilen-JSON-Prozessor. Er liest NDJSON standardmassig (ein JSON-Wert pro Zeile) und unterstutzt Filtern, Mapping, Gruppieren und Neuformatieren. Verwenden Sie jq -c fur kompakte Ausgabe und jq -s, um alle Datensatze in ein Array zu laden.
ndjson-cli
CLIndjson-cli ist eine Sammlung von Unix-artigen Befehlen zur Manipulation von NDJSON-Streams: ndjson-filter, ndjson-map, ndjson-reduce, ndjson-sort und ndjson-join. Jeder Befehl liest von stdin und schreibt auf stdout, was sie mit Pipes kombinierbar macht.
ndjson (npm)
Node.jsDas ndjson-npm-Paket bietet Streaming-NDJSON-Parser und -Serialisierer fur Node.js. Es stellt ndjson.parse()- und ndjson.stringify()-Transform-Streams bereit, die sich direkt in Node.js-Stream-Pipelines fur die Hochdurchsatz-Datenverarbeitung integrieren lassen.
NDJSON und JSONL: Interoperabilitat
NDJSON und JSONL (JSON Lines) sind funktional identische Formate. Beide speichern einen JSON-Wert pro Zeile, getrennt durch Zeilenumbruchzeichen. Eine Datei, die gultiges NDJSON ist, ist auch gultiges JSONL und umgekehrt. Sie konnen eine .ndjson-Datei in .jsonl umbenennen (oder umgekehrt), ohne ein einziges Byte am Inhalt zu andern, und jedes Tool, das ein Format liest, wird auch das andere lesen.
Die einzigen Unterschiede sind kosmetischer Natur: NDJSON stammt von github.com/ndjson/ndjson-spec und verwendet die .ndjson-Erweiterung mit dem MIME-Typ application/x-ndjson, wahrend JSONL von jsonlines.org stammt und die .jsonl-Erweiterung verwendet. In der Praxis behandeln die meisten Entwickler die beiden Namen als Synonyme. Wenn Ihr Projekt bereits JSONL verwendet, besteht keine Notwendigkeit, zu NDJSON zu migrieren, und wenn eine Bibliothek angibt, NDJSON zu unterstutzen, wird sie mit Ihren .jsonl-Dateien ohne Anderungen funktionieren.
Probieren Sie unsere kostenlosen NDJSON/JSONL-Tools
Arbeiten Sie mit NDJSON- und JSONL-Dateien direkt in Ihrem Browser. Die gesamte Verarbeitung erfolgt lokal, sodass Ihre Daten privat bleiben.