Formato de líneas JSON: por qué jsonl es mejor que un JSON normal para raspado web by@slotix
66,336 lecturas

Formato de líneas JSON: por qué jsonl es mejor que un JSON normal para raspado web

2018/12/18
por @slotix 66,336 lecturas
ES
Read on Terminal Reader

Demasiado Largo; Para Leer


Company Mentioned

Mention Thumbnail
featured image - Formato de líneas JSON: por qué jsonl es mejor que un JSON normal para raspado web
Dmitry Narizhnykh HackerNoon profile picture

@slotix

Dmitry Narizhnykh
react to story with heart

image

Introducción a los formatos CSV y JSON

El formato de valores separados por comas (CSV) es un formato de intercambio de datos común que se usa ampliamente para representar conjuntos de registros con una lista de campos idéntica.

La notación de objetos de JavaScript (JSON) en la actualidad se convirtió de facto en el estándar de formato de intercambio de datos, reemplazando a XML, que era una gran palabra de moda a principios de la década de 2000. No solo es autodescriptivo, sino también legible por humanos.

Veamos ejemplos de ambos formatos.

Aquí hay una lista de familias representadas como datos CSV:

id,padre,madre,hijos1,Mark,Charlotte,12,John,Ann,33,Bob,Monika,2

CSV parece mucho más simple que el análogo de matriz JSON que se muestra a continuación:

[{"id":1,"padre":"Mark","madre":"Charlotte","hijos":1},{"id":2,"padre":"Juan","madre": "Ann","hijos":3},{"id":3,"padre":"Bob","madre":"Monika","hijos":2},]

Pero CSV se limita a almacenar datos bidimensionales sin tipo. No hay forma de almacenar estructuras anidadas o tipos de valores como nombres de niños en CSV simple.

[{"id":1,"padre":"Mark","madre":"Charlotte","hijos":["Tom"]},{"id":2,"padre":"Juan", "madre":"Ann","hijos":["Jessika","Antony","Jack"]},{"id":3,"padre":"Bob","madre":"Monika", "niños":["Jerry","Karol"]},]

Sin embargo, representar estructuras anidadas en archivos JSON es fácil.

¿Por qué no simplemente rodear todos los datos con una matriz JSON normal para que el archivo en sí sea json válido?

Para insertar o leer un registro de una matriz JSON, debe analizar todo el archivo, lo que está lejos de ser ideal.

Dado que cada entrada en JSON Lines es un JSON válido, se puede analizar/desmontar como un documento JSON independiente. Por ejemplo, puede buscar dentro de él, dividir un archivo de 10 gb en archivos más pequeños sin analizar todo.

1. No es necesario leer todo el archivo en la memoria antes de analizarlo. 2. Puede agregar fácilmente más líneas al archivo simplemente agregando al archivo. Si todo el archivo fuera una matriz JSON, tendría que analizarlo, agregar la nueva línea y luego volver a convertirlo a JSON.

Por lo tanto, no es práctico mantener varios gigabytes como una sola matriz JSON. Teniendo en cuenta que los usuarios del kit de Dataflow necesitarían almacenar y analizar grandes volúmenes de datos, hemos implementado la exportación al formato JSONL .

image

Líneas JSON (jsonl), JSON delimitado por nueva línea (ndjson), JSON delimitado por línea (ldjson) son tres términos que expresan los mismos formatos destinados principalmente a la transmisión JSON.

Veamos qué es JSON Lines y cómo se compara con otros formatos de transmisión JSON.

Líneas JSON frente a JSON

Exactamente la misma lista de familias expresada en formato JSON Lines se ve así:

{"id":1,"padre":"Mark","madre":"Charlotte","hijos":["Tom"]}{"id":2,"padre":"John","madre ":"Ann","hijos":["Jessika","Antony","Jack"]}{"id":3,"padre":"Bob","madre":"Monika","hijos" :["Jerry","Karol"]}

Las líneas JSON consisten esencialmente en varias líneas donde cada línea individual es un objeto JSON válido, separadas por el carácter de nueva línea `\n` .

No requiere analizadores personalizados. Simplemente lea una línea, analice como JSON, lea una línea, analice como JSON... y así sucesivamente.

En realidad ya es muy común en la industria usar jsonl

Haga clic en el enlace a continuación para encontrar más detalles sobre la especificación de líneas JSON.

Líneas JSON _Esta página describe el formato de texto de líneas JSON, también llamado JSON delimitado por saltos de línea. JSON Lines es un formato conveniente..._jsonlines.org

Líneas JSON frente a secuencias de texto JSON

Comparemos el formato de secuencia de texto JSON y el tipo de medio asociado "application/json-seq" con NDJSON . Consiste en cualquier cantidad de textos JSON, todos codificados en UTF-8, cada uno con el prefijo de un separador de registro ASCII (0x1E) y cada uno termina con un carácter de avance de línea ASCII (0x0A).

Veamos la lista de personas mencionadas anteriormente expresadas como archivo de secuencia JSON:

<RS>{"id":1,"padre":"Mark","madre":"Charlotte","hijos":["Tom"]}<LF><RS>{"id":2," padre":"Juan","madre":"Ann","hijos":["Jessika","Antony","Jack"]}<LF><RS>{"id":3,"padre": "Bob","madre":"Monika","hijos":["Jerry","Karol"]}<LF>

<RS> aquí hay un marcador de posición para el separador de registro ASCII no imprimible (0x1E). <LF> representa el carácter de salto de línea.

El formato se ve casi idéntico a JSON Lines excepto por este símbolo especial al principio de cada registro.

Como estos dos formatos son tan similares, es posible que se pregunte por qué existen ambos.

El formato de secuencias de texto JSON se usa para un contexto de transmisión. Entonces, este formato no define la extensión de archivo correspondiente. Aunque la especificación de formato de secuencias de texto JSON registra el nuevo tipo de medio MIME application/json-seq. Es propenso a errores almacenar y editar este formato en un editor de texto, ya que el carácter no imprimible (0x1E) puede estar distorsionado.

Puede considerar usar líneas JSON como una alternativa consistente.

Líneas JSON frente a JSON concatenado

Otra alternativa a JSON Lines es JSON concatenado. En este formato, cada texto JSON no está separado en absoluto.

Aquí está la representación JSON concatenada de un ejemplo anterior:

{"id":1,"padre":"Mark","madre":"Charlotte","hijos":["Tom"]}{"id":2,"padre":"John","madre ":"Ann","hijos":["Jessika","Antony","Jack"]}{"id":3,"padre":"Bob","madre":"Monika","hijos" :["Jerry","Karol"]}

JSON concatenado no es un formato nuevo, es simplemente un nombre para transmitir varios objetos JSON sin delimitadores.

Si bien generar JSON no es una tarea tan compleja, analizar este formato en realidad requiere un esfuerzo significativo. De hecho, debe implementar un analizador contextual que detecte registros individuales y los separe correctamente.

Bonitos formatos JSON impresos

Si tiene estructuras anidadas grandes, no se recomienda leer directamente el texto de las líneas JSON. Use la herramienta jq para facilitar la visualización de estructuras grandes:

grep . families.jsonl | jq

Como resultado, verá un archivo JSON bastante impreso:

{"id": 1,"padre": "Mark","madre": "Charlotte","hijos": ["Tom"]}{"id": 2,"padre": "Juan","madre ": "Ann","hijos": ["Jessika","Antony","Jack"]}{"id": 3,"padre": "Bob","madre": "Monika","hijos" : ["Jerry","Karol"]}

Conclusión

El archivo JSON Lines completo como un todo técnicamente ya no es JSON válido, porque contiene varios textos JSON.

El hecho de que cada nueva línea signifique una entrada separada hace que el archivo con formato JSON Lines se pueda transmitir. Puede leer tantas líneas como sea necesario para obtener la misma cantidad de registros.

Convierta los sitios web en datos estructurados/Kit de flujo de datos _Plataforma de código abierto de raspado web escrita en Go_dataflowkit.com

HISTORIAS RELACIONADAS

L O A D I N G
. . . comments & more!
Hackernoon hq - po box 2206, edwards, colorado 81632, usa