La transmisión de JSON comprende protocolos de comunicación para delimitar objetos JSON, basados en protocolos de bajo nivel orientados a flujos (como TCP ), que garantizan el reconocimiento de objetos JSON individuales cuando el servidor y los clientes utilizan el mismo protocolo (por ejemplo, codificado implícitamente). Esto es necesario ya que JSON es un protocolo no concatenativo (la concatenación de dos objetos JSON no produce un objeto JSON válido).
Introducción
JSON es un formato popular para el intercambio de datos de objetos entre sistemas. Con frecuencia, es necesario enviar un flujo de objetos a través de una única conexión, como un indicador bursátil o registros de aplicaciones . [ 1 ] En estos casos, es necesario identificar dónde termina un objeto codificado en JSON y comienza el siguiente. Técnicamente, esto se conoce como enmarcado .
Existen cuatro formas comunes de lograrlo:
- Envía los objetos JSON formateados sin saltos de línea y usa un salto de línea como delimitador. [ 2 ]
- Envía los objetos JSON concatenados con un carácter de control separador de registros como delimitador. [ 3 ]
- Envía los objetos JSON concatenados sin delimitadores y utiliza un analizador de flujo para extraerlos.
- Envía los objetos JSON precedidos de su longitud y utiliza un analizador de flujo para extraerlos.
Comparación
El JSON delimitado por líneas funciona muy bien con las herramientas tradicionales orientadas a líneas .
El JSON concatenado funciona con JSON con formato legible, pero requiere más esfuerzo y complejidad para su análisis. No se adapta bien a las herramientas tradicionales orientadas a líneas. La transmisión de JSON concatenado es un superconjunto de la transmisión de JSON delimitado por líneas.
El JSON con prefijo de longitud funciona con JSON con formato legible. No se adapta bien a las herramientas tradicionales orientadas a líneas, pero puede ofrecer ventajas de rendimiento sobre el procesamiento de datos en flujo delimitado por líneas o concatenado. Además, puede ser más sencillo de analizar.
Aproches
JSON delimitado por saltos de línea
Dos términos para formatos equivalentes de JSON delimitado por líneas son:
- JSON delimitado por saltos de línea (NDJSON) [ 4 ] [ 5 ] - El nombre anterior era JSON delimitado por líneas (LDJSON). [ 6 ]
- Líneas JSON (JSONL), [ 7 ] que es la actual ( 2025) y el estándar más utilizado, en Big Data y otras aplicaciones. [ 8 ]
El streaming aprovecha el hecho de que el formato JSON no permite caracteres de retorno de carro ni de salto de línea dentro de valores primitivos (en las cadenas, estos deben escaparse como ` <br>` \ry \n`<sup>`, respectivamente) y que la mayoría de los formateadores JSON, por defecto, no incluyen espacios en blanco, incluidos los retornos de carro y los saltos de línea. Estas características permiten utilizar el carácter de salto de línea o la secuencia de retorno de carro y salto de línea como delimitador.
Este ejemplo muestra dos objetos JSON (el carácter de nueva línea implícito al final de cada línea no se muestra):
{ "alguna" : "cosa\n" } { "puede" :{ "incluir" : "anidado" , "objetos" :[ "y" , "matrices" ]}}El uso de un salto de línea como delimitador permite que este formato funcione muy bien con las herramientas tradicionales de Unix orientadas a líneas .
Un archivo de registro, por ejemplo, podría tener este aspecto:
{ "ts" : "2020-06-18T10:44:12" , "started" :{ "pid" : 45678 }}{ "ts" : "2020-06-18T10:44:13" , "logged_in" :{ "username" : "foo" }, "connection" :{ "addr" : "1.2.3.4" , "port" : 5678 }}{ "ts" : "2020-06-18T10:44:15" , "registered" :{ "username" : "bar" , "email" : "bar@example.com" }, "connection" :{ "addr" : "2.3.4.5" , "port" : 6789 }}{ "ts" : "2020-06-18T10:44:16" , "logged_out" :{ "username" : "foo" }, "connection" :{ "addr" : "1.2.3.4" , "port" : 5678 }}que es muy fácil de ordenar por fecha, buscar nombres de usuario, acciones, direcciones IP, etc.
Compatibilidad
Un analizador que admita JSON concatenado puede leer JSON delimitado por líneas. Sin embargo, un analizador de JSON delimitado por líneas no puede leer JSON concatenado que contenga saltos de línea dentro de un objeto JSON.
Los términos "JSON delimitado por líneas" y "JSON delimitado por saltos de línea" se utilizan con frecuencia sin aclarar si se admiten saltos de línea incrustados.
Anteriormente, la especificación JSON delimitada por saltos de línea [ 9 ] permitía incluir comentarios si los dos primeros caracteres de una línea eran "//". Esto no se podía utilizar con analizadores JSON estándar si se incluían comentarios. La versión actual de la especificación ("NDJSON - JSON delimitado por saltos de línea") [ 10 ] ya no incluye comentarios.
El JSON concatenado se puede convertir en JSON delimitado por líneas mediante una utilidad JSON adecuada como jq . Por ejemplo
jq --compact-output . < concatenated.json > lines.json JSON delimitado por separadores de registros
La transmisión de JSON delimitada por separadores de registro permite delimitar secuencias de texto JSON sin necesidad de que el formateador JSON excluya los espacios en blanco. Dado que las secuencias de texto JSON no pueden contener caracteres de control, se puede utilizar un separador de registro para delimitarlas. Además, se recomienda que cada secuencia de texto JSON vaya seguida de un salto de línea para gestionar correctamente los objetos JSON de nivel superior que no se autodelimitan (números, verdadero, falso y nulo).
Este formato también se conoce como secuencias de texto JSON o tipo MIMEapplication/json-seq , y se describe formalmente en el RFC 7464 de la IETF .
El siguiente ejemplo muestra dos objetos JSON donde ␞ representa el carácter de control separador de registros y ␊ representa el carácter de salto de línea:
␞ { "alguna" : "cosa\n" } ␊ ␞ { "puede" : { "incluir" : "anidado" , "objetos" : [ "y" , "matrices" ] } } ␊JSON concatenado
La transmisión de JSON concatenado permite al remitente escribir cada objeto JSON en el flujo sin delimitadores. Requiere que el receptor utilice un analizador que pueda reconocer y emitir cada objeto JSON a medida que se procesa el carácter de terminación. El JSON concatenado no es un formato nuevo; simplemente es una denominación para la transmisión de múltiples objetos JSON sin delimitadores.
La ventaja de este formato es que puede manejar objetos JSON formateados con caracteres de salto de línea incrustados, por ejemplo, con formato legible para humanos. Por ejemplo, estas dos entradas son válidas y producen la misma salida:
{ "alguna" : "cosa\n" }{ "puede" :{ "incluir" : "anidado" , "objetos" :[ "y" , "matrices" ]}}{ "alguna" : "cosa\n" } { "puede" : { "incluir" : "anidado" , "objetos" : [ "y" , "matrices" ] } }Las implementaciones que dependen de la entrada de datos por líneas pueden requerir un salto de línea después de cada objeto JSON para que el analizador lo procese correctamente. (De lo contrario, la línea podría permanecer en el búfer de entrada sin ser procesada por el analizador). Esto rara vez se considera un problema, ya que terminar los objetos JSON con un salto de línea es muy común.
JSON con prefijo de longitud
La transmisión JSON con prefijo de longitud o enmarcada permite al remitente especificar explícitamente la longitud de cada mensaje. Para ello, el receptor utiliza un analizador que reconoce cada longitud n y lee los n bytes siguientes para interpretarlos como JSON.
La ventaja de este formato radica en que acelera el análisis, ya que la longitud exacta de cada mensaje se especifica explícitamente, en lugar de obligar al analizador a buscar delimitadores. El formato JSON con prefijo de longitud también resulta idóneo para aplicaciones TCP, donde un único "mensaje" puede dividirse en fragmentos arbitrarios, puesto que la longitud predefinida indica al analizador la cantidad exacta de bytes que debe esperar antes de intentar analizar una cadena JSON.
Este ejemplo muestra dos objetos JSON con prefijo de longitud (donde cada longitud es la longitud en bytes de la siguiente cadena JSON):
18 { "alguna" : "cosa\n" } 55 { "puede" :{ "incluir" : "anidado" , "objetos" :[ "y" , "matrices" ]}}Aplicaciones y herramientas
JSON delimitado por saltos de línea
- jq puede crear y leer textos JSON delimitados por líneas.
- Jackson (API) puede leer y escribir textos JSON delimitados por líneas.
- Logstash incluye un códec json_lines . [ 11 ]
- Módulo ldjson-stream para Node.js
- Módulo ld-jsonstream sin dependencias para Node.js
- json-stream-es es una biblioteca de JavaScript/TypeScript (para el frontend y el backend) que permite crear y leer documentos JSON delimitados por saltos de línea.
- ArduinoJson es una biblioteca de C++ que admite JSON delimitado por líneas.
- RecordStream: Un conjunto de herramientas para manipular JSON delimitado por líneas (generar, transformar, recopilar estadísticas y formatear resultados).
- El paquete encoding/json de la biblioteca estándar de Go se puede utilizar para leer y escribir JSON delimitado por líneas.
- RDF4J y Ontotext GraphDB admiten NDJSON para JSON-LD (llamado NDJSONLD) [ 12 ] desde febrero de 2021. [ 13 ]
JSON delimitado por separadores de registros
- jq puede crear y leer textos JSON delimitados por separadores de registros.
- json-stream-es es una biblioteca de JavaScript/TypeScript (tanto para el frontend como para el backend) que permite crear y leer documentos JSON delimitados por separadores de registros.
JSON concatenado
- concatjson Módulo analizador/serializador de JSON concatenado para Node.js
- json-stream-es es una biblioteca de JavaScript/TypeScript (para el frontend y el backend) que permite crear y leer documentos JSON concatenados.
- Jackson (API) puede leer y escribir contenido JSON concatenado.
- jq, procesador JSON ligero y flexible de línea de comandos
- Analizador JSON de transmisión de Noggit Solr para Java
- Yajl – Otra biblioteca JSON más. YAJL es un pequeño analizador JSON basado en eventos (estilo SAX) escrito en ANSI C y un pequeño generador de JSON con validación.
- ArduinoJson es una biblioteca de C++ que admite JSON concatenado.
- GSON JsonStreamParser.java puede leer JSON concatenado.
- json-stream es un analizador JSON de transmisión para Python.
JSON con prefijo de longitud
- missive Biblioteca rápida y ligera para codificar y decodificar mensajes JSON con prefijo de longitud a través de flujos.
- Mensajería nativa WebExtensions Mensajería nativa
Referencias
- ↑ Ryan, Film Grain. "Cómo creamos Filmgrain, parte 2 de 2" . filmgrainapp.com. Archivado del original el 5 de julio de 2013. Consultado el 4 de julio de 2013 .
- ↑ "Líneas JSON" .
- ↑ Williams, N. (2015). "RFC 7464" . Solicitud de comentarios . doi : 10.17487/RFC7464 .
- ↑ "ndjson - JSON delimitado por saltos de línea - Formato para datos estructurados" . ndjson.org . Archivado del original el 18 de diciembre de 2023. Consultado el 22 de octubre de 2025 .
- ↑ ndjson/ndjson-spec , ndjson, 18-10-2025 , consultado el 22-10-2025
- ↑ ndjson. "Actualizar specification_draft2.md · ndjson/ndjson-spec@c658c26" . GitHub . Consultado el 22 de octubre de 2025 .
- ↑ "Líneas JSON" . jsonlines.org . Consultado el 22 de octubre de 2025 .
- ↑ "JSON Lines | En la web" . jsonlines.org . Consultado el 22 de octubre de 2025 .
- ↑ "JSON delimitado por saltos de línea" . Jimbo JW . Archivado del original el 22/12/2015.
- ↑ "NDJSON - JSON delimitado por saltos de línea" . GitHub . 2 de junio de 2021.
- ↑ "Registro centralizado con Monolog, Logstash y Elasticsearch" .
- ↑ "Paquete org.eclipse.rdf4j.rio.ndjsonld" . Fundación Eclipse . Consultado el 1 de mayo de 2023 .
- ↑ "Introducción a la implementación de RDFParser y RDFWriter para el formato JSON-LD delimitado por saltos de línea" . Repositorio de Github de rdf4j . Febrero de 2021. Consultado el 1 de mayo de 2023 .
- JSON
- formatos de serialización de datos