Tutorial JSONL: Crear, leer y convertir archivos JSONL
Un tutorial paso a paso que cubre todo lo que necesitas saber sobre trabajar con archivos JSONL (JSON Lines). Incluye ejemplos de código en Python, JavaScript y herramientas CLI.
Última actualización: febrero de 2026
¿Qué es JSONL?
JSONL (JSON Lines) es un formato de texto ligero donde cada línea es un valor JSON separado y válido. A diferencia del JSON estándar, que envuelve todos los datos en un único arreglo u objeto, JSONL almacena un registro por línea, separados por caracteres de nueva línea (\n).
Esta estructura línea por línea hace que JSONL sea ideal para transmitir grandes datasets, agregar registros sin reescribir el archivo y procesar datos en paralelo. Es ampliamente usado por OpenAI para datasets de fine-tuning, por sistemas de registro como el stack ELK y por herramientas de big data como BigQuery y Apache Spark.
{"id":1,"name":"Alicia","role":"ingeniera"}{"id":2,"name":"Roberto","role":"diseñador"}{"id":3,"name":"Carlos","role":"gerente"}
Cómo crear archivos JSONL
Crear un archivo JSONL es sencillo: serializa cada registro como una cadena JSON de una sola línea y escríbela seguida de una nueva línea. Aquí hay ejemplos en los lenguajes más populares.
import jsonrecords = [{"id": 1, "name": "Alicia", "role": "ingeniera"},{"id": 2, "name": "Roberto", "role": "diseñador"},{"id": 3, "name": "Carlos", "role": "gerente"},]with open("output.jsonl", "w", encoding="utf-8") as f:for record in records:f.write(json.dumps(record, ensure_ascii=False) + "\n")print("Creado output.jsonl con", len(records), "registros")
import { writeFileSync } from 'fs';const records = [{ id: 1, name: 'Alicia', role: 'ingeniera' },{ id: 2, name: 'Roberto', role: 'diseñador' },{ id: 3, name: 'Carlos', role: 'gerente' },];const jsonl = records.map(record => JSON.stringify(record)).join('\n');writeFileSync('output.jsonl', jsonl + '\n', 'utf-8');console.log(`Creado output.jsonl con ${records.length} registros`);
Manual / Editor de texto
También puedes crear archivos JSONL en cualquier editor de texto. Simplemente escribe un objeto JSON válido por línea sin comas entre líneas, y guarda el archivo con extensión .jsonl. Asegúrate de que cada línea sea JSON completo y válido.
Cómo leer archivos JSONL
Debido a que cada línea es un valor JSON independiente, leer archivos JSONL es tan simple como iterar sobre líneas. Aquí están los enfoques más comunes.
import jsonwith open("data.jsonl", "r", encoding="utf-8") as f:for line_number, line in enumerate(f, 1):line = line.strip()if not line:continue # saltar líneas vacíasrecord = json.loads(line)print(f"Línea {line_number}: {record['name']} - {record['role']}")
import { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.jsonl', 'utf-8'),});let lineNumber = 0;for await (const line of rl) {if (!line.trim()) continue; // saltar líneas vacíaslineNumber++;const record = JSON.parse(line);console.log(`Línea ${lineNumber}: ${record.name} - ${record.role}`);}
# Ver las primeras 10 líneashead -n 10 data.jsonl# Contar total de registroswc -l data.jsonl# Imprimir de forma legible cada línea con jqcat data.jsonl | jq .# Filtrar registros donde role es "ingeniera"cat data.jsonl | jq 'select(.role == "ingeniera")'# Extraer solo el campo namecat data.jsonl | jq -r '.name'# Buscar líneas que contengan una palabra clavegrep '"Alicia"' data.jsonl
Cómo convertir JSON a JSONL
Si tienes un arreglo JSON estándar, convertir a JSONL significa escribir cada elemento como una línea separada. Esta es una de las operaciones JSONL más comunes.
import json# Leer arreglo JSONwith open("data.json", "r", encoding="utf-8") as f:data = json.load(f) # espera un arreglo JSON# Escribir como JSONLwith open("data.jsonl", "w", encoding="utf-8") as f:for record in data:f.write(json.dumps(record, ensure_ascii=False) + "\n")print(f"Convertidos {len(data)} registros de JSON a JSONL")
import { readFileSync, writeFileSync } from 'fs';// Leer arreglo JSONconst data = JSON.parse(readFileSync('data.json', 'utf-8'));// Escribir como JSONLconst jsonl = data.map(record => JSON.stringify(record)).join('\n');writeFileSync('data.jsonl', jsonl + '\n', 'utf-8');console.log(`Convertidos ${data.length} registros de JSON a JSONL`);
Cómo convertir CSV a JSONL
Convertir CSV a JSONL mapea cada fila a un objeto JSON, usando el encabezado CSV como nombres de campos. Esto es útil al migrar datos tabulares a un formato adecuado para streaming o aprendizaje automático.
import csvimport jsonwith open("data.csv", "r", encoding="utf-8") as csv_file:reader = csv.DictReader(csv_file)with open("data.jsonl", "w", encoding="utf-8") as jsonl_file:for row in reader:jsonl_file.write(json.dumps(row, ensure_ascii=False) + "\n")print("CSV convertido a JSONL exitosamente")
import { readFileSync, writeFileSync } from 'fs';const csv = readFileSync('data.csv', 'utf-8');const lines = csv.trim().split('\n');const headers = lines[0].split(',');const jsonl = lines.slice(1).map(line => {const values = line.split(',');const obj = {'};headers.forEach((h, i) => obj[h.trim()] = values[i]?.trim());return JSON.stringify(obj);}).join('\n');writeFileSync('data.jsonl', jsonl + '\n', 'utf-8');console.log('CSV convertido a JSONL exitosamente');
Mejores prácticas para JSONL
Usa codificación UTF-8 para todos los archivos JSONL. Esto asegura compatibilidad entre plataformas y soporta caracteres internacionales.
Escribe exactamente un objeto JSON por línea. Nunca dividas un objeto JSON en múltiples líneas ni pongas múltiples objetos en la misma línea.
No agregues comas entre líneas. A diferencia de los arreglos JSON, JSONL usa caracteres de nueva línea como único delimitador.
Valida cada línea independientemente. Cada línea debe ser un valor JSON completo y válido. Usa un validador JSONL para detectar errores de sintaxis temprano.
Usa lecturas de streaming para archivos grandes. En lugar de cargar el archivo completo en memoria, procésalo línea por línea usando readline (Node.js) o iteración de archivos (Python).
Mantén los registros consistentes en estructura. Aunque JSONL permite diferentes esquemas por línea, mantener una estructura uniforme hace que el procesamiento de datos sea mucho más fácil.
Evita espacios en blanco finales. Asegúrate de que las líneas no tengan espacios o tabulaciones extra que puedan causar problemas de parseo.
Termina el archivo con una nueva línea. Una nueva línea final después del último registro ayuda a herramientas como wc y cat a manejar el archivo correctamente.
Errores comunes en JSONL
[
{"name":"Alicia"},
{"name":"Roberto"}
]{"name":"Alicia"}
{"name":"Roberto"}JSONL no es un arreglo JSON. No envuelvas las líneas en corchetes ni agregues comas entre ellas. Cada línea existe por sí sola.
{"name":"Alicia"},
{"name":"Roberto"},{"name":"Alicia"}
{"name":"Roberto"}Comas finales después de cada línea o comas entre líneas son inválidas en JSONL. El carácter de nueva línea es el único separador.
{
"name": "Alicia",
"age": 30
}{"name":"Alicia","age":30}Cada objeto JSON debe caber en una sola línea. JSON impreso de forma legible con indentación y saltos de línea no es JSONL válido.
{"text":"Ella dijo "hola""}{"text":"Ella dijo \"hola\""}Comillas y caracteres especiales dentro de cadenas JSON deben escaparse correctamente con barras invertidas. Comillas sin escapar romperán el parser JSON.