Guide complet NDJSON : Newline Delimited JSON expliqué
Un guide complet sur Newline Delimited JSON (NDJSON). Apprenez la spécification, le type MIME, comment lire et écrire du NDJSON en Python, Node.js et en ligne de commande, l’utiliser dans les API HTTP en streaming et comprendre sa relation avec JSONL.
Dernière mise à jour : février 2026
Qu’est-ce que NDJSON ?
NDJSON signifie Newline Delimited JSON. C’est un format de données texte où chaque ligne contient exactement une valeur JSON valide, séparée par un caractère de retour à la ligne (\n). Le format a été conçu pour le streaming et le traitement de grands jeux de données sans charger l’ensemble du fichier en mémoire. Contrairement à un fichier JSON standard qui encapsule tout dans un seul tableau ou objet, NDJSON vous permet de lire, écrire et traiter les enregistrements un par un.
La spécification NDJSON est hébergée sur github.com/ndjson/ndjson-spec. Elle a été créée pour formaliser un pattern qui était déjà devenu courant dans l’envoi de logs, les pipelines de données et les API HTTP en streaming. Chaque ligne est autonome : si une ligne contient du JSON invalide, les autres lignes peuvent toujours être analysées avec succès. Cela rend NDJSON tolérant aux pannes et bien adapté aux workflows en ajout seul tels que les logs d’application, les flux d’événements et les exports de données incrémentiels.
{"id":1,"event":"page_view","url":"/home"}{"id":2,"event":"click","url":"/pricing"}{"id":3,"event":"signup","url":"/register"}
La spécification NDJSON
La spécification officielle NDJSON sur github.com/ndjson/ndjson-spec est intentionnellement minimaliste. Elle définit une convention simple pour sérialiser plusieurs valeurs JSON dans un seul flux texte. Les règles fondamentales sont simples :
La spécification évite délibérément d’ajouter des en-têtes, des métadonnées ou des informations de schéma au format. Cela maintient NDJSON aussi simple que possible et compatible avec les outils standard de traitement de texte Unix. Toute valeur JSON valide est autorisée sur chaque ligne, bien qu’en pratique la plupart des fichiers NDJSON contiennent des objets JSON avec un ensemble cohérent de clés.
- Chaque ligne DOIT contenir exactement une valeur JSON valide (objet, tableau, chaîne, nombre, booléen ou null).
- Les lignes sont séparées par le caractère de retour à la ligne '\n' (U+000A). Le retour chariot '\r' (U+000D) peut apparaître avant '\n' mais n’est pas obligatoire.
- Un retour à la ligne final après la dernière valeur JSON est autorisé mais non requis.
- Chaque valeur JSON ne doit pas contenir de caractères de retour à la ligne non échappés au sein de la valeur elle-même.
Comme les règles sont minimales, NDJSON est facile à générer depuis n’importe quel langage de programmation disposant d’un sérialiseur JSON. Sérialisez simplement chaque enregistrement, ajoutez un retour à la ligne et écrivez-le dans la sortie. Pas de crochets fermants, pas de virgules finales, pas de structure de tableau englobante à gérer.
NDJSON vs JSON vs JSONL
NDJSON, JSON et JSONL ont chacun une structure différente. Le JSON standard encode une valeur unique (généralement un tableau ou un objet). JSONL et NDJSON stockent tous deux une valeur JSON par ligne, et ils sont fonctionnellement identiques. Le tableau ci-dessous met en évidence les principales différences entre les trois formats.
| Caractéristique | JSON | JSONL | NDJSON |
|---|---|---|---|
| Nom complet | JavaScript Object Notation | JSON Lines | Newline Delimited JSON |
| Extension de fichier | .json | .jsonl | .ndjson |
| Type MIME | application/json | application/jsonl (non officiel) | application/x-ndjson |
| Spécification | RFC 8259 (norme IETF) | jsonlines.org (communauté) | github.com/ndjson/ndjson-spec (communauté) |
| Délimiteur de ligne | N/A (valeur unique) | \n (retour à la ligne) | \n (retour à la ligne) |
| Retour à la ligne final | N/A | Recommandé | Optionnel |
| Compatible streaming | Non (document entier requis) | Oui (ligne par ligne) | Oui (ligne par ligne) |
Type MIME NDJSON : application/x-ndjson
Le type MIME enregistré pour NDJSON est application/x-ndjson. Ce type de contenu est utilisé dans les en-têtes HTTP pour indiquer que le corps de la réponse contient des données JSON délimitées par des retours à la ligne. De nombreuses API en streaming, dont l’API GitHub, l’API Docker Registry et l’API bulk d’Elasticsearch, utilisent ce type MIME pour délivrer des réponses NDJSON.
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');
Certaines API acceptent également application/json-seq (RFC 7464) ou text/plain comme alternatives. Cependant, application/x-ndjson est le type MIME le plus largement adopté pour les flux JSON délimités par des retours à la ligne. Lors de la création d’une nouvelle API qui diffuse des enregistrements JSON, utilisez application/x-ndjson pour une compatibilité maximale.
Lire et écrire du NDJSON
Travailler avec NDJSON est simple dans n’importe quel langage qui prend en charge JSON. Voici des exemples pratiques pour Python, Node.js et la ligne de commande.
Le module json intégré de Python gère naturellement NDJSON. Lisez les lignes d’un fichier, analysez chacune avec json.loads et écrivez avec json.dumps. Pour les fichiers volumineux, cette approche ligne par ligne utilise une mémoire constante.
guide-ndjson-complete-guide.ndjsonGuide.readWrite.python.code
En Node.js, utilisez le module readline avec fs.createReadStream pour analyser efficacement les fichiers NDJSON. Le flux traite une ligne à la fois, maintenant une utilisation mémoire faible quelle que soit la taille du fichier.
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');
L’outil en ligne de commande jq comprend nativement l’entrée NDJSON. Utilisez le flag --slurp pour collecter tous les enregistrements dans un tableau, ou traitez chaque enregistrement individuellement sans aucun 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 dans les API HTTP en streaming
NDJSON est le standard de facto pour les API HTTP en streaming qui délivrent des données en temps réel. Lorsqu’un serveur envoie une réponse NDJSON, le client peut commencer à traiter le premier enregistrement dès son arrivée, sans attendre que la réponse complète soit terminée. C’est plus rapide et plus efficace en mémoire que de retourner un grand tableau JSON.
Parmi les services populaires qui utilisent le streaming NDJSON, on trouve Docker Registry (événements de couches d’images), Elasticsearch (opérations en masse), Apache CouchDB (flux de modifications) et de nombreuses API modernes événementielles. Le pattern fonctionne bien avec les alternatives aux Server-Sent Events, le suivi de logs en temps réel et le chargement progressif de données dans les applications web.
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);}
Outils de l’écosystème NDJSON
Un écosystème croissant d’outils en ligne de commande et de bibliothèques prend en charge NDJSON nativement. Ces outils vous permettent de filtrer, transformer et analyser des données NDJSON sans écrire de code personnalisé.
jq
Essentieljq est le processeur JSON en ligne de commande le plus populaire. Il lit NDJSON par défaut (une valeur JSON par ligne) et prend en charge le filtrage, le mapping, le regroupement et le reformatage. Utilisez jq -c pour une sortie compacte et jq -s pour regrouper tous les enregistrements dans un tableau.
ndjson-cli
CLIndjson-cli est une collection de commandes de style Unix pour manipuler des flux NDJSON : ndjson-filter, ndjson-map, ndjson-reduce, ndjson-sort et ndjson-join. Chaque commande lit depuis stdin et écrit vers stdout, les rendant composables avec des pipes.
ndjson (npm)
Node.jsLe package npm ndjson fournit des parseurs et sérialiseurs NDJSON en streaming pour Node.js. Il expose des transform streams ndjson.parse() et ndjson.stringify() qui s’intègrent directement dans les pipelines de streams Node.js pour un traitement de données à haut débit.
NDJSON et JSONL : interopérabilité
NDJSON et JSONL (JSON Lines) sont des formats fonctionnellement identiques. Les deux stockent une valeur JSON par ligne, séparée par des caractères de retour à la ligne. Un fichier NDJSON valide est aussi un fichier JSONL valide, et vice versa. Vous pouvez renommer un fichier .ndjson en .jsonl (ou inversement) sans changer un seul octet de contenu, et tout outil qui lit un format lira l’autre.
Les seules différences sont cosmétiques : NDJSON provient de github.com/ndjson/ndjson-spec et utilise l’extension .ndjson avec le type MIME application/x-ndjson, tandis que JSONL provient de jsonlines.org et utilise l’extension .jsonl. En pratique, la plupart des développeurs traitent les deux noms comme des synonymes. Si votre projet utilise déjà JSONL, il n’y a pas besoin de migrer vers NDJSON, et si une bibliothèque indique qu’elle prend en charge NDJSON, elle fonctionnera avec vos fichiers .jsonl sans aucune modification.
Essayez nos outils NDJSON/JSONL gratuits
Travaillez avec des fichiers NDJSON et JSONL directement dans votre navigateur. Tout le traitement se fait localement, vos données restent donc privées.