Cada elemento de un array JSON pasa a ser una línea de JSONL
Un array JSON es un único documento JSON: valores separados por comas entre corchetes [ ]. JSONL (JSON Lines) escribe un valor JSON por línea y separa los valores con saltos de línea. Los dos formatos pueden contener la misma lista, pero se leen de forma distinta. Un array hay que leerlo hasta el corchete de cierre para que el documento esté completo, mientras que JSONL se puede leer línea a línea y permite añadir un registro nuevo escribiendo una línea al final. El array de ejemplo de arriba contiene cuatro pedidos, así que al convertirlo salen cuatro líneas de JSONL.
Este conversor mira lo que has pegado, decide si es un array o JSONL y ajusta el sentido por ti. Si la entrada es una respuesta de API con formato legible (varias líneas) envuelta en un objeto, como {"data": [ … ]}, busca el array que contiene y convierte ese. Una respuesta minificada en una sola línea se lee como una línea JSONL, así que cambia el sentido a «Array JSON → JSONL». El panel de resultado lista las líneas, y cada línea tiene un número, una letra de forma y una barra de tamaño, y puedes pulsar una línea para desplegar su valor. En la composición de claves, más abajo, unas barras indican a qué elementos les falta una clave y dónde una misma clave mezcla números y cadenas. El texto y los archivos que introduces no se envían a ningún servidor: todo se procesa en este navegador.
Cuándo convertir entre un array JSON y JSONL
- Para preparar un archivo de entrada de la API Batch de OpenAI: un trabajo por lotes lee cada línea de un archivo .jsonl como una solicitud, y cada solicitud necesita un custom_id distinto. Un lote admite hasta 50.000 solicitudes y el archivo de entrada puede pesar hasta 200 MB. Si has montado la lista de solicitudes como array, conviértela a JSONL y comprueba en la composición de claves que custom_id lleva la etiqueta «Valores únicos».
- Para cargar datos en un almacén como BigQuery: la documentación de Google Cloud indica que el JSON que se carga debe estar delimitado por saltos de línea, con cada objeto en su propia línea. Un archivo de array tal como lo devuelve una API no cumple esa condición, así que primero hay que convertirlo a JSONL.
- Para pasar registros acumulados a un programa que espera un solo documento: un log JSONL que ha crecido línea a línea hay que agruparlo en un array JSON antes de dárselo a una herramienta de gráficos o a código JavaScript que lee un único documento JSON.
- Para dividir datos grandes y procesarlos por partes: si cortas JSONL por número de líneas, cada trozo sigue siendo JSONL válido. Si cortas un array, los corchetes y las comas quedan descuadrados en el corte y hay que arreglar cada trozo, así que JSONL es más cómodo para datos que vas a enviar o procesar por partes.
Reglas de conversión
- Array JSON → JSONL: cada elemento del array más externo se convierte en una línea. Solo se eliminan los espacios y saltos de línea que quedan fuera de las cadenas; la notación de los números, los escapes y el orden de las claves se conservan tal cual. Las líneas terminan en LF, se añade un LF final tras la última línea, como recomienda el documento de JSON Lines, y no se añade BOM. Un array vacío [] no tiene elementos, así que el resultado ocupa 0 bytes.
- Respuestas de API envueltas: si el valor más externo es un objeto, el conversor busca un array dentro (hasta 3 niveles de claves, como en data.items). Elige primero el array con más objetos, y con el selector «Array a convertir» de la barra superior puedes escoger otro array o «Todo el objeto en una línea».
- JSONL → array JSON: cada línea se lee como un valor JSON y pasa a ser un elemento del array. También se aceptan los finales de línea CRLF de Windows. JSON Lines no considera válida una línea en blanco, así que se notifica como error. El formato del array se elige entre sangría de 2 espacios, sangría de 4 espacios, un elemento por línea o todo en una línea.
- Lectura flexible: omite líneas en blanco, comas finales, valores con sangría repartidos en varias líneas y caracteres separadores RS (0x1E), y lee los valores uno tras otro. La especificación de NDJSON permite ignorar en silencio las líneas en blanco, pero pide que ese comportamiento esté documentado y se pueda configurar. Por eso esta opción viene desactivada y, cuando hay un error, la tarjeta de error te ofrece un botón para activarla al instante.
- Detección automática del sentido: el sentido solo se ajusta al pegar o al abrir un archivo, que reemplazan toda la entrada. Un único array entre corchetes y un único objeto repartido en varias líneas (una respuesta de API con formato legible) se tratan como un array JSON; todo lo demás, incluido un objeto escrito en una línea, se trata como JSONL, porque un objeto de una línea, como la línea de una solicitud de la API Batch, es una línea JSONL. Una respuesta de API minificada en una sola línea también se lee como una línea JSONL; para dividir en líneas el array que contiene, cambia el sentido a «Array JSON → JSONL». Mientras escribes a mano, el sentido nunca cambia.
- Tipos de valor: JSON Lines admite como valor de una línea números, cadenas, arrays y null, además de objetos. Este conversor traslada todos los valores y la composición de claves indica aparte cuántos elementos no son objetos.
Ejemplo: cuatro pedidos se convierten en cuatro líneas de JSONL
Este es el array de la primera pantalla convertido a JSONL. El tamaño es el número de bytes UTF-8 sin contar el salto de línea, y las líneas con el mismo conjunto de claves llevan la misma letra de forma.
| Línea | Contenido JSONL | Tamaño | Forma |
|---|---|---|---|
| 1 | {"id":1001,"cliente":"Lucía","cantidad":2,"etiquetas":["nuevo","cupón"]} | 74 B | A |
| 2 | {"id":1002,"cliente":"Mateo","cantidad":1,"nota":"Déjalo en la puerta\nNo llames al timbre"} | 93 B | B |
| 3 | {"id":1003,"cliente":"Carmen","cantidad":3,"etiquetas":[]} | 58 B | A |
| 4 | {"id":1004,"cliente":"Pablo","cantidad":"2","etiquetas":["habitual"]} | 69 B | A |
El array de entrada con sangría ocupa 341 bytes, y el resultado JSONL ocupa 298 bytes una vez sumados los cuatro saltos de línea. El \n que se ve en la nota de la línea 2 es un escape escrito dentro de la cadena, no un salto de línea real, de modo que todo el objeto sigue en una sola línea. Si agrupas esas mismas cuatro líneas de nuevo en un array JSON, el tamaño depende del formato del array de esta manera.
| Formato del array | Tamaño | Útil para |
|---|---|---|
| Sangría de 2 espacios | 452 B | Revisar la estructura a simple vista |
| Sangría de 4 espacios | 558 B | Subirlo a un repositorio de código que usa sangría de 4 espacios |
| Un elemento por línea | 313 B | Control de versiones, donde un elemento modificado aparece como una diferencia de una sola línea |
| Todo en una línea | 300 B | Enviar los datos con el menor tamaño posible |
Qué comprobar en la composición de claves
- Formas A y B: los elementos con el mismo conjunto de claves reciben la misma letra, y la forma más frecuente es la A. En el ejemplo, la A abarca tres pedidos y solo el pedido 2, que tiene nota y no tiene etiquetas, es B (+nota −etiquetas). Al pulsar una etiqueta de forma se resaltan en el panel de resultado las líneas con esa forma.
- La barra de una tarjeta de clave: muestra qué proporción de los elementos contiene esa clave y qué tipos de valor tiene (número, cadena, booleano y null, objeto y array). La parte vacía de la barra representa los elementos que no tienen la clave. Si pulsas una tarjeta con parte vacía, se resaltan las líneas a las que les falta esa clave.
- Tipos mezclados: en el ejemplo, cantidad es un número en tres pedidos y la cadena "2" en uno. Una base de datos o una herramienta de análisis que fija el tipo de cada columna puede dar error o convertir un valor así, de modo que conviene unificarlo de antemano. null aparece con frecuencia como valor vacío, por lo que no cuenta como mezcla.
- Valores únicos: esta etiqueta se asigna a una clave que está en todos los elementos, tiene un único tipo de valor y no repite ningún valor. Sirve para comprobar claves que no pueden coincidir, como id o el custom_id de la API Batch.
- Avisos: los números fuera del rango de enteros seguros, los elementos en los que un objeto repite una clave y los elementos que no son objetos se notifican aparte, encima de la composición de claves.
Errores frecuentes
| Entrada | Cuál es el problema | Cómo se corrige |
|---|---|---|
| JSONL con líneas en blanco entre las líneas | En JSON Lines, una línea en blanco es un error. | Borra las líneas en blanco o activa «Lectura flexible». |
Una coma al final de la línea, como en {"a":1}, | Parece el interior de un array copiado tal cual, así que no es JSONL. | Borra la coma o activa «Lectura flexible». |
| Objetos con sangría en varias líneas, uno tras otro | Un valor no cabe en una sola línea. | Léelos con «Lectura flexible», o envuélvelos en un array y conviértelos con «Array JSON → JSONL». |
{'a': 1, 'b': None} | Es un diccionario de Python impreso tal cual. JSON solo usa comillas dobles y null. | Vuelve a imprimirlo con el módulo json de Python. |
[1, 2,] | JSON no admite una coma después del último elemento. | Quita la coma anterior al corchete de cierre. |
| Un salto de línea o un tabulador reales dentro de una cadena | JSON exige escapar los caracteres de control dentro de las cadenas (RFC 8259 §7). | Escribe el salto de línea como \n y el tabulador como \t. |
{"codigo_postal": 0012} | Un número JSON no puede empezar por 0. | Escríbelo como cadena, por ejemplo "0012". |
NaN, Infinity | La sintaxis de JSON no incluye estos valores (RFC 8259 §6). | Sustitúyelos por null o por una cadena. |
Cuando hay un error, la zona del resultado muestra la línea y el carácter en que ocurre y marca el punto del problema dentro de esa línea. Si pulsas «Ver la posición en la entrada», el cursor salta directamente a ese carácter en el cuadro de entrada.
Los enteros grandes y las claves repetidas se trasladan tal como están escritos
El estándar JSON señala que los enteros de −(253)+1 a (253)−1 se leen igual en programas distintos (RFC 8259 §6). El mayor entero que JavaScript representa con exactitud es 9.007.199.254.740.991. Este conversor no convierte los números en números de cálculo: copia los caracteres que has escrito, de modo que un número de pedido fuera de ese rango no cambia. Tampoco elimina una clave que aparece dos veces en un mismo objeto. Aun así, el programa que reciba el resultado puede leerlo de otra manera.
| Valor de entrada | Resultado de este conversor | Valor leído con JSON.parse de JavaScript |
|---|---|---|
9007199254740993 | 9007199254740993 | 9007199254740992 |
{"id":1,"id":2} | {"id":1,"id":2} | {"id":2} |
1.50e+3 | 1.50e+3 | 1500 |
"é" | "é" | "é" |
El estándar JSON dice que el comportamiento de un programa que recibe un objeto con un nombre repetido es impredecible, y señala que muchas implementaciones conservan solo el último par (RFC 8259 §4). El módulo json de Python también usa el último valor. Por eso la composición de claves avisa del número de elementos con una clave repetida y, en las tarjetas de clave, cuenta según el último valor. Para que los identificadores largos no cambien en el programa receptor, es más seguro tratarlos como cadenas, por ejemplo "9007199254740993".
Las especificaciones de JSON Lines y NDJSON, las RFC 8259 y 7464, la guía Batch de OpenAI, la documentación de BigQuery de Google Cloud, la documentación de json de Python y las páginas de MDN se comprobaron con los textos originales el 2026-10-20.
Límites y precauciones
- Se convierten entradas de hasta 5 MB (5.242.880 bytes) y resultados de hasta 32 MB. Un archivo comprimido con gzip (como .jsonl.gz) se descomprime antes de leerlo y se mide por su tamaño descomprimido. Si los datos son mayores, divídelos por líneas y procesa el JSONL por partes.
- El panel de resultado muestra las primeras 400 líneas, los primeros 20.000 caracteres al desplegar un valor, hasta 24 tarjetas de clave y hasta 8 etiquetas de forma. Al copiar y al guardar se incluye el resultado completo.
- La composición de claves cuenta solo las claves más externas de cada elemento. Las claves de los objetos anidados dentro de un objeto no se cuentan.
- El anidamiento se lee hasta 512 niveles. Los archivos se leen como UTF-8 (se quita el BOM inicial) y también se leen los archivos UTF-16 con BOM. Los archivos que se guardan van en UTF-8 sin comprimir y sin BOM.
- Las secuencias de texto JSON (RFC 7464), que separan los valores con el carácter RS, solo se pueden leer con «Lectura flexible»; esta herramienta no escribe ese formato.
- Este conversor solo comprueba la sintaxis JSON. Comprueba en la documentación del servicio las claves (como custom_id) y los tipos de datos que exige el programa receptor.
Fuentes
- 01JSON LinesUn valor JSON válido por línea (se admite cualquier valor y una línea en blanco no es válida), las líneas terminan en '\n' (también se lee '\r\n'), se recomienda terminar la última línea, sin BOM, extensiones .jsonl y .jsonl.gz — comprobado el 2026-10-20
- 02NDJSON — especificación de Newline Delimited JSONSeparadores '\n' o '\r\n', las líneas en blanco pueden ignorarse en silencio (MAY, documentado y configurable), tipo de medio application/x-ndjson, extensión .ndjson
- 03IETF — RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format§4 los nombres dentro de un objeto DEBERÍAN ser únicos y el comportamiento con duplicados es impredecible, §6 enteros interoperables [−(253)+1, (253)−1] y sin Infinity ni NaN, §7 los caracteres de control deben escaparse, §8.1 BOM
- 04IETF — RFC 7464: JavaScript Object Notation (JSON) Text SequencesCada valor va precedido de un carácter RS (0x1E), tipo de medio application/json-seq
- 05OpenAI — guía de la API BatchCada línea del archivo .jsonl es una solicitud, cada solicitud lleva un custom_id único, hasta 50.000 solicitudes por lote y un archivo de entrada de 200 MB
- 06Google Cloud — Loading JSON data from Cloud Storage (BigQuery)Los datos JSON deben estar delimitados por saltos de línea (ndJSON), con un objeto por línea; ndJSON es el mismo formato que JSON Lines
- 07Documentación de Python — json: JSON encoder and decoderSi un nombre se repite dentro de un objeto, solo se usa el valor del último par nombre/valor
- 08MDN — Number.MAX_SAFE_INTEGEREl mayor entero seguro de JavaScript, 253 − 1 = 9.007.199.254.740.991
- 09MDN — JSON.parse()Los números JSON se convierten en números de JavaScript y pueden perder precisión; los números grandes pueden intercambiarse como cadenas
Preguntas frecuentes
¿Cómo convierto un array JSON a JSONL?
Pega el array JSON en el cuadro de entrada de arriba o abre un archivo, y en el cuadro de resultado aparece al instante el JSONL con un elemento por línea. Cópialo con el botón de copiar o descarga un archivo .jsonl con el botón Guardar JSONL. Si pegas JSONL, el sentido cambia a «JSONL → array JSON» y las líneas se agrupan en un array.
¿Basta con cambiar la extensión de .json a .jsonl?
No. Al cambiar la extensión, el contenido sigue siendo un array, con los corchetes exteriores y las comas entre elementos. JSONL necesita un valor por línea y sin corchetes, así que hay que separar los elementos en líneas y reescribirlos, que es lo que hace este conversor.
¿Y si la respuesta de la API viene envuelta, como {"data": [...]}?
Una respuesta con formato legible (varias líneas) se puede pegar tal cual: si el valor más externo es un objeto, el conversor busca los arrays que contiene (hasta 3 niveles de claves) y convierte a JSONL el que tiene más objetos. Una respuesta minificada en una sola línea se lee como una línea JSONL, así que elige el sentido «Array JSON → JSONL». Para usar otro array o convertir todo el objeto en una línea, elígelo en «Array a convertir» de la barra superior.
¿Qué pasa si hay una línea en blanco en medio del JSONL?
Según las reglas de JSON Lines, una línea en blanco es un error, así que el conversor te indica de qué línea se trata. Borra la línea en blanco o pulsa el botón «Lectura flexible» de la tarjeta de error para omitirlas y agrupar los valores en un array. Un único salto de línea tras la última línea no es un error.
He pegado objetos con sangría en varias líneas y me da error.
JSONL necesita cada valor entero en una sola línea, así que un objeto con sangría en varias líneas produce el error de que el valor no termina en su primera línea. Activa «Lectura flexible» para leer los valores uno tras otro sin tener en cuenta las líneas y agruparlos en un array; si luego conviertes ese array a JSONL, obtendrás una línea ordenada por elemento.
¿Un número o una cadena que no sean objetos pueden ser una línea?
Sí. JSON Lines admite como valor de una línea números, cadenas, arrays y null, además de objetos, y este conversor los traslada tal cual. Como muchas herramientas solo admiten objetos, la composición de claves indica cuántos elementos no son objetos.
¿Se modifican los números largos o las claves repetidas?
No. Los números no se convierten en números de cálculo: se copian los caracteres que has escrito, así que un entero grande como 9007199254740993 y una notación como 1.50e+3 se quedan como están, y una clave que aparece dos veces no se elimina. El programa receptor puede redondear un número grande o conservar solo la última clave, por lo que la composición de claves muestra un aviso.
¿Se guarda mi JSON o mi archivo en un servidor?
No. La conversión se hace solo en este navegador y el texto y los archivos que introduces no se envían a ningún servidor. Al cerrar la página, la entrada también desaparece.