Guia Completa de NDJSON: JSON Delimitado por Nueva Linea Explicado

Una guia completa sobre Newline Delimited JSON (NDJSON). Aprende la especificacion, tipo MIME, como leer y escribir NDJSON en Python, Node.js y la linea de comandos, usarlo en APIs HTTP en streaming y entender su relacion con JSONL.

Ultima actualizacion: febrero 2026

Que es NDJSON?

NDJSON son las siglas de Newline Delimited JSON (JSON Delimitado por Nueva Linea). Es un formato de datos basado en texto donde cada linea contiene exactamente un valor JSON valido, separado por un caracter de nueva linea (\n). El formato fue disenado para streaming y procesamiento de grandes datasets sin cargar todo el archivo en memoria. A diferencia de un archivo JSON estandar que envuelve todo en un unico array u objeto, NDJSON te permite leer, escribir y procesar registros uno a la vez.

La especificacion NDJSON esta alojada en github.com/ndjson/ndjson-spec. Fue creada para formalizar un patron que ya se habia vuelto comun en envio de logs, pipelines de datos y APIs HTTP en streaming. Cada linea es autocontenida: si una linea contiene JSON invalido, las demas lineas aun pueden parsearse exitosamente. Esto hace que NDJSON sea tolerante a fallos y adecuado para flujos de trabajo de solo-adicion como logs de aplicaciones, flujos de eventos y exportaciones incrementales de datos.

Ejemplo NDJSON (3 registros)
{"id":1,"event":"page_view","url":"/home"}
{"id":2,"event":"click","url":"/pricing"}
{"id":3,"event":"signup","url":"/register"}

La Especificacion NDJSON

La especificacion oficial de NDJSON en github.com/ndjson/ndjson-spec es intencionalmente minima. Define una convencion simple para serializar multiples valores JSON en un unico flujo de texto. Las reglas principales son directas:

La especificacion evita explicitamente agregar cabeceras, metadatos o informacion de esquema al formato. Esto mantiene NDJSON lo mas simple posible y compatible con herramientas estandar de procesamiento de texto Unix. Cualquier valor JSON valido esta permitido en cada linea, aunque en la practica la mayoria de los archivos NDJSON contienen objetos JSON con un conjunto consistente de claves.

  • Cada linea DEBE contener exactamente un valor JSON valido (objeto, array, cadena, numero, booleano o null).
  • Las lineas se separan por el caracter de nueva linea '\n' (U+000A). El retorno de carro '\r' (U+000D) puede aparecer antes de '\n' pero no es requerido.
  • Se permite una nueva linea final despues del ultimo valor JSON pero no es obligatoria.
  • Cada valor JSON no debe contener caracteres de nueva linea sin escapar dentro del propio valor.

Dado que las reglas son minimas, NDJSON es facil de generar desde cualquier lenguaje de programacion que tenga un serializador JSON. Simplemente serializa cada registro, agrega una nueva linea y escribelo en la salida. Sin corchetes de cierre, sin comas finales, sin estructura de array envolvente de la que preocuparse.

NDJSON vs JSON vs JSONL

NDJSON, JSON y JSONL tienen estructuras diferentes. JSON estandar codifica un unico valor (generalmente un array u objeto). JSONL y NDJSON almacenan un valor JSON por linea y son funcionalmente identicos entre si. La tabla a continuacion destaca las diferencias clave entre los tres formatos.

CaracteristicaJSONJSONLNDJSON
Nombre CompletoJavaScript Object NotationJSON LinesNewline Delimited JSON
Extension de Archivo.json.jsonl.ndjson
Tipo MIMEapplication/jsonapplication/jsonl (no oficial)application/x-ndjson
EspecificacionRFC 8259 (estandar IETF)jsonlines.org (comunidad)github.com/ndjson/ndjson-spec (comunidad)
Delimitador de LineaN/A (valor unico)\n (nueva linea)\n (nueva linea)
Nueva Linea FinalN/ARecomendadaOpcional
Compatible con StreamingNo (debe parsear el documento completo)Si (linea por linea)Si (linea por linea)

Tipo MIME de NDJSON: application/x-ndjson

El tipo MIME registrado para NDJSON es application/x-ndjson. Este tipo de contenido se usa en cabeceras HTTP para indicar que el cuerpo de la respuesta contiene datos JSON delimitados por nueva linea. Muchas APIs en streaming, incluyendo la API de GitHub, la API del registro Docker y la API bulk de Elasticsearch, usan este tipo MIME para entregar respuestas NDJSON.

Cabecera HTTP Content-Type
Content-Type: application/x-ndjson
# Example: curl a streaming API
curl -H "Accept: application/x-ndjson" https://api.example.com/events/stream
# Example: Express.js response
res.setHeader('Content-Type', 'application/x-ndjson');
res.write(JSON.stringify(record) + '\n');

Algunas APIs tambien aceptan application/json-seq (RFC 7464) o text/plain como alternativas. Sin embargo, application/x-ndjson es el tipo MIME mas ampliamente adoptado para flujos JSON delimitados por nueva linea. Al construir una nueva API que transmita registros JSON, usa application/x-ndjson para maxima compatibilidad.

Leer y Escribir NDJSON

Trabajar con NDJSON es sencillo en cualquier lenguaje que soporte JSON. A continuacion se muestran ejemplos practicos para Python, Node.js y la linea de comandos.

El modulo json integrado de Python maneja NDJSON de forma natural. Lee lineas de un archivo, parsea cada una con json.loads y escribe con json.dumps. Para archivos grandes, este enfoque linea por linea usa memoria constante.

Python: Leer y Escribir NDJSON
guide-ndjson-complete-guide.ndjsonGuide.readWrite.python.code

En Node.js, usa el modulo readline con fs.createReadStream para parsear archivos NDJSON de manera eficiente. El stream procesa una linea a la vez, manteniendo bajo el uso de memoria sin importar el tamano del archivo.

Node.js: Leer y Escribir NDJSON
import { createReadStream, writeFileSync } from 'node:fs';
import { createInterface } from 'node:readline';
// Read NDJSON
async 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 NDJSON
const 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');

La herramienta de linea de comandos jq entiende nativamente la entrada NDJSON. Usa la bandera --slurp para recopilar todos los registros en un array, o procesa cada registro individualmente sin ninguna bandera.

Linea de Comandos: Procesar NDJSON con jq
# 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 fields
jq {id, url} data.ndjson
# Count total records
jq -s 'length' data.ndjson
# Convert NDJSON to a JSON array
jq -s '.' data.ndjson > data.json
# Convert a JSON array back to NDJSON
jq -c '.[]' data.json > data.ndjson

NDJSON en APIs HTTP en Streaming

NDJSON es el estandar de facto para APIs HTTP en streaming que entregan datos en tiempo real. Cuando un servidor envia una respuesta NDJSON, el cliente puede empezar a procesar el primer registro tan pronto como llega, sin esperar a que se complete toda la respuesta. Esto es mas rapido y mas eficiente en memoria que devolver un array JSON grande.

Los servicios populares que usan streaming NDJSON incluyen Docker Registry (eventos de capas de imagenes), Elasticsearch (operaciones masivas), Apache CouchDB (feed de cambios) y muchas APIs modernas basadas en eventos. El patron funciona bien con alternativas a Server-Sent Events, tail de logs en tiempo real y carga progresiva de datos en aplicaciones web.

Servidor de Streaming NDJSON con Express.js
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 events
let 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);
Navegador: Consumir Stream NDJSON con Fetch
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);
}
// Usage
for await (const event of readNdjsonStream('/api/events/stream')) {
console.log('Received:', event);
}

Herramientas del Ecosistema NDJSON

Un ecosistema creciente de herramientas de linea de comandos y bibliotecas soporta NDJSON de forma nativa. Estas herramientas te permiten filtrar, transformar y analizar datos NDJSON sin escribir codigo personalizado.

jq

Esencial

jq es el procesador JSON de linea de comandos mas popular. Lee NDJSON por defecto (un valor JSON por linea) y soporta filtrado, mapeo, agrupacion y reformateo. Usa jq -c para salida compacta y jq -s para agrupar todos los registros en un array.

ndjson-cli

CLI

ndjson-cli es una coleccion de comandos estilo Unix para manipular flujos NDJSON: ndjson-filter, ndjson-map, ndjson-reduce, ndjson-sort y ndjson-join. Cada comando lee de stdin y escribe en stdout, haciendolos componibles con pipes.

ndjson (npm)

Node.js

El paquete npm ndjson proporciona parsers y serializadores de streaming NDJSON para Node.js. Expone transform streams ndjson.parse() y ndjson.stringify() que se integran directamente en pipelines de streams de Node.js para procesamiento de datos de alto rendimiento.

NDJSON y JSONL: Interoperabilidad

NDJSON y JSONL (JSON Lines) son formatos funcionalmente identicos. Ambos almacenan un valor JSON por linea, separados por caracteres de nueva linea. Un archivo que es NDJSON valido tambien es JSONL valido, y viceversa. Puedes renombrar un archivo .ndjson a .jsonl (o al reves) sin cambiar un solo byte de contenido, y toda herramienta que lee un formato leera el otro.

Las unicas diferencias son cosmeticas: NDJSON proviene de github.com/ndjson/ndjson-spec y usa la extension .ndjson con el tipo MIME application/x-ndjson, mientras que JSONL proviene de jsonlines.org y usa la extension .jsonl. En la practica, la mayoria de los desarrolladores tratan los dos nombres como sinonimos. Si tu proyecto ya usa JSONL, no hay necesidad de migrar a NDJSON, y si una biblioteca dice que soporta NDJSON, funcionara con tus archivos .jsonl sin ningun cambio.

JSONL vs NDJSON: Comparacion Detallada

Para una inmersion mas profunda en la historia, diferencias de especificacion y adopcion por la comunidad de JSONL y NDJSON, lee nuestra guia de comparacion dedicada.

Prueba Nuestras Herramientas Gratuitas de NDJSON/JSONL

Trabaja con archivos NDJSON y JSONL directamente en tu navegador. Todo el procesamiento ocurre localmente, asi que tus datos permanecen privados.

Trabaja con Archivos NDJSON Online

Visualiza, valida y convierte archivos NDJSON y JSONL de hasta 1 GB directamente en tu navegador. Sin subidas necesarias, 100% privado.

Preguntas Frecuentes

Guía del formato NDJSON — Newline Delimited JSON y JSONL ...