Conversione fra JSON Lines (JSONL) e vettori JSON

Converte in entrambi i sensi fra il formato JSON Lines, che dispone un oggetto JSON per riga, e il consueto vettore JSON. Comodo per gli insiemi di dati dell'apprendimento automatico e per l'esame dei registri.

Consigli per l'uso

  • Il formato JSON Lines dispone su ciascuna riga un oggetto JSON indipendente ed è adottato come standard negli insiemi di dati per la messa a punto dei modelli e nelle uscite di registro di piattaforme come Elasticsearch e Logstash.
  • Nella modalità che porta da JSONL a vettore, ogni riga deve essere un oggetto JSON analizzabile per conto proprio. Le righe vuote sono saltate automaticamente.
  • Nella modalità inversa, l'intera immissione deve costituire un unico vettore JSON, nella forma `[ ... ]`; ciascun elemento del vettore è prodotto su una riga di JSONL.
  • Convertendo in vettore JSON un registro voluminoso in JSONL, lo si potrà trattare più agevolmente con il comando jq o con gli analizzatori JSON standard dei linguaggi di programmazione.

Domande frequenti

Il vettore JSON racchiude tutto in un'unica struttura, nella forma `[ {...}, {...} ]`, e non permette di accedere ai singoli elementi prima di averlo analizzato per intero. JSON Lines dispone invece un oggetto indipendente per riga e consente l'elaborazione in flusso continuo, riga per riga: si presta perciò al trattamento sequenziale di registri enormi e di insiemi di dati per l'apprendimento automatico.

Negli insiemi di dati per la messa a punto dei modelli sulle piattaforme di apprendimento automatico, nei formati di uscita degli strumenti di raccolta dei registri come Elasticsearch e Logstash e nell'elaborazione in flusso continuo di grandi moli di dati: ovunque occorra leggere e scrivere un elemento alla volta in modo indipendente.

Nella modalità che porta da JSONL a vettore ogni riga deve essere un JSON valido per conto proprio: basta un errore di sintassi in una riga perché compaia un messaggio con il numero di quella riga. Nella modalità inversa l'intera immissione deve essere un vettore, cioè cominciare con la parentesi quadra aperta e terminare con quella chiusa.

Il vettore JSON ottenuto si tratta direttamente con il comando jq e con gli analizzatori standard dei vari linguaggi. Il JSONL, invece, si sposa bene con `jq -c` e con gli strumenti che lavorano riga per riga, come grep e awk, ed è facile da inserire in una catena di analisi dei registri.
Tool-kun

A proposito — perché è nato il formato «un elemento per riga»

Il formato JSON Lines nasce da un limite del consueto vettore JSON: finché non lo si è letto tutto in memoria e analizzato per intero, non se ne può estrarre nemmeno un elemento. Trattando come vettore JSON registri di milioni di righe o insiemi di dati per l'addestramento, occorreva caricare in memoria l'intero file, con problemi di memoria insufficiente e di tempi di analisi crescenti.

JSON Lines risolve la questione con un vincolo semplicissimo: una riga, un oggetto JSON compiuto. Si può leggere il file riga per riga analizzando via via, senza caricarlo tutto in memoria: una caratteristica che si sposa perfettamente con l'elaborazione in flusso continuo e con quella parallela. Questa impostazione si accorda anche con la tradizionale cultura testuale dei sistemi Unix, dove una riga è un elemento e i comandi come grep, awk e sed lavorano riga per riga: da qui il notevole vantaggio pratico di potersi innestare direttamente negli strumenti a riga di comando esistenti.

Oggi il formato è largamente adottato per la distribuzione degli insiemi di dati nel campo dell'intelligenza artificiale: i dati di addestramento dei grandi modelli linguistici e le coppie di richiesta e risposta per la messa a punto sono ormai comunemente distribuiti in JSON Lines.