JSONL vs NDJSON: ¿Cuál es la diferencia?
Una guía completa que compara JSONL (JSON Lines) y NDJSON (Newline Delimited JSON) — dos nombres para casi el mismo formato, con diferencias sutiles que vale la pena conocer.
Última actualización: febrero de 2026
Comparación rápida: JSONL vs NDJSON
| Característica | JSONL (JSON Lines) | NDJSON |
|---|---|---|
| Nombre completo | JSON Lines | Newline Delimited JSON |
| Extensión de archivo | .jsonl | .ndjson |
| Especificación | jsonlines.org (informal) | github.com/ndjson/ndjson-spec (especificación informal) |
| Origen | Convención comunitaria, popularizada por herramientas de ciencia de datos | Propuesta por Chris Olah, Thorsten Ball y otros |
| Delimitador de línea | \n (nueva línea) | \n (nueva línea) |
| Tipo MIME | application/jsonl (no oficial) | application/x-ndjson |
| Soporte de streaming | Sí, línea por línea | Sí, línea por línea |
| Adopción | OpenAI, Hugging Face, ecosistema ML/AI | Elasticsearch, Apache Spark, ingeniería de datos |
¿Qué es JSONL (JSON Lines)?
JSONL, abreviatura de JSON Lines, es un formato de datos basado en texto donde cada línea contiene un único valor JSON válido. Las líneas están separadas por caracteres de nueva línea (\n). El formato fue popularizado por las comunidades de aprendizaje automático y ciencia de datos, y está definido informalmente en jsonlines.org.
Los archivos JSONL usan la extensión de archivo .jsonl. El formato se ha convertido en el estándar para datos de entrenamiento de AI y ML — OpenAI requiere archivos .jsonl para fine-tuning, y los datasets de Hugging Face comúnmente usan el formato JSON Lines.
{"id": 1, "text": "Hola mundo", "label": "saludo"}{"id": 2, "text": "¿Cómo estás?", "label": "pregunta"}{"id": 3, "text": "Adiós", "label": "despedida"}
¿Qué es NDJSON (Newline Delimited JSON)?
NDJSON, o Newline Delimited JSON, es un formato de datos donde cada línea es un valor JSON válido separado por caracteres de nueva línea. La especificación está alojada en github.com/ndjson/ndjson-spec y fue formalizada para proporcionar un estándar más estructurado para datos JSON delimitados por líneas.
Los archivos NDJSON usan la extensión de archivo .ndjson y tienen un tipo MIME registrado de application/x-ndjson. El formato es ampliamente adoptado en ingeniería de datos, procesamiento de logs y aplicaciones de streaming — Elasticsearch, Apache Spark y muchas APIs de streaming HTTP usan NDJSON.
{"id": 1, "text": "Hola mundo", "label": "saludo"}{"id": 2, "text": "¿Cómo estás?", "label": "pregunta"}{"id": 3, "text": "Adiós", "label": "despedida"}
¿Son JSONL y NDJSON el mismo formato?
En la práctica, sí — JSONL y NDJSON son formatos funcionalmente idénticos. Ambos almacenan un valor JSON por línea, separados por caracteres de nueva línea (\n). Un archivo .jsonl y un archivo .ndjson con los mismos datos son completamente intercambiables, y cualquier herramienta que lea un formato puede leer el otro.
Las diferencias son puramente en nomenclatura, adopción comunitaria y convenciones de metadatos. JSONL (JSON Lines) surgió de la comunidad de ciencia de datos y aprendizaje automático, mientras que NDJSON (Newline Delimited JSON) fue formalizado por la comunidad de ingeniería de datos y streaming web. Piensa en ello como "película" vs "film" — lo mismo, preferencias de nombre diferentes en diferentes círculos.
La diferencia más significativa es la extensión de archivo (.jsonl vs .ndjson) y el tipo MIME. NDJSON tiene un tipo MIME más ampliamente reconocido (application/x-ndjson) que se usa en contextos de streaming HTTP, mientras que los archivos JSONL son el estándar en flujos de trabajo de AI/ML. Al elegir entre ellos, sigue la convención de tu ecosistema.
Diferencias clave entre JSONL y NDJSON
1. Especificación y autoridad
Definido en jsonlines.org con una especificación concisa e informal. La especificación es directa: cada línea es un valor JSON válido, las líneas están separadas por '\n', y se recomienda la codificación UTF-8.
Definido en github.com/ndjson/ndjson-spec con una especificación ligeramente más formal. NDJSON requiere explícitamente que cada línea sea un valor JSON válido y que el separador de línea sea '\n' (no '\r\n'), con una nueva línea final recomendada.
2. Extensión de archivo
Usa la extensión de archivo .jsonl. Este es el estándar para archivos de fine-tuning de OpenAI, datasets de Hugging Face y la mayoría de las herramientas ML/AI. GitHub y VS Code reconocen archivos .jsonl con resaltado de sintaxis.
Usa la extensión de archivo .ndjson. Esto es común en herramientas de ingeniería de datos, APIs masivas de Elasticsearch y respuestas HTTP de streaming. Muchos editores también soportan resaltado de sintaxis .ndjson.
3. Tipo MIME
No hay un tipo MIME oficialmente registrado. Los tipos no oficiales comunes incluyen application/jsonl y application/json-lines. En la práctica, muchos sistemas usan application/jsonl o recurren a application/json.
Usa application/x-ndjson como su tipo MIME. Esto es más ampliamente reconocido en contextos HTTP y es usado por Elasticsearch, el estándar de streaming de Fetch API y varios frameworks web para respuestas de streaming.
4. Adopción comunitaria y de ecosistema
Dominante en el ecosistema AI/ML. OpenAI, Anthropic, Google Gemini, Hugging Face y la mayoría de los frameworks ML usan .jsonl. El término 'JSONL' es más comúnmente buscado y reconocido en la comunidad de desarrolladores en general.
Preferido en ingeniería de datos y sistemas backend. Elasticsearch, Apache Spark, PostgreSQL COPY y muchas herramientas de agregación de logs usan NDJSON. El paquete ndjson de npm tiene millones de descargas semanales.
Cuándo usar JSONL vs NDJSON
- Prepares datos de entrenamiento para OpenAI, Anthropic u otro fine-tuning de LLM
- Trabajes con datasets de Hugging Face
- Construyas pipelines ML y preprocesamiento de datos
- Tu equipo o documentación se refiera a 'JSON Lines'
- Subas archivos a plataformas AI/ML que esperan la extensión .jsonl
- Trabajes en entornos de ciencia de datos de Python
- Hagas streaming de datos JSON sobre HTTP (Server-Sent Events, fetch streaming)
- Trabajes con la API masiva de Elasticsearch
- Construyas pipelines de datos con Apache Spark o herramientas similares
- Establezcas encabezados Content-Type (application/x-ndjson)
- Tu infraestructura o equipo use la convención NDJSON
- Trabajes con bibliotecas de streaming de Node.js
Ejemplos de código: Leer JSONL y NDJSON
# Leer JSONL - exactamente igual que leer NDJSONimport jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line.strip())print(record['text'])# Salida:# Hola mundo# ¿Cómo estás?# Adiós
// Leer NDJSON - exactamente igual que leer JSONLimport { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.ndjson')});for await (const line of rl) {const record = JSON.parse(line);console.log(record.text);}// Salida:// Hola mundo// ¿Cómo estás?// Adiós