Tutorial JSONL: Creare, Leggere e Convertire File JSONL
Un tutorial passo-passo che copre tutto ciò che devi sapere sul lavoro con file JSONL (JSON Lines). Include esempi di codice in Python, JavaScript e strumenti CLI.
Ultimo aggiornamento: febbraio 2026
Cos'è JSONL?
JSONL (JSON Lines) è un formato di testo leggero in cui ogni riga è un valore JSON valido separato. A differenza del JSON standard, che racchiude tutti i dati in un singolo array o oggetto, JSONL memorizza un record per riga, separati da caratteri di nuova riga (\n).
Questa struttura riga per riga rende JSONL ideale per lo streaming di grandi dataset, l'aggiunta di record senza riscrivere il file e l'elaborazione dei dati in parallelo. È ampiamente utilizzato da OpenAI per dataset di fine-tuning, da sistemi di logging come lo stack ELK e da strumenti di big data come BigQuery e Apache Spark.
{"id":1,"name":"Alice","role":"engineer"}{"id":2,"name":"Bob","role":"designer"}{"id":3,"name":"Charlie","role":"manager"}
Come Creare File JSONL
Creare un file JSONL è semplice: serializza ogni record come una stringa JSON su una singola riga e scrivilo seguito da una nuova riga. Ecco esempi nei linguaggi più popolari.
import jsonrecords = [{"id": 1, "name": "Alice", "role": "engineer"},{"id": 2, "name": "Bob", "role": "designer"},{"id": 3, "name": "Charlie", "role": "manager"},]with open("output.jsonl", "w", encoding="utf-8") as f:for record in records:f.write(json.dumps(record, ensure_ascii=False) + "\n")print("Created output.jsonl with", len(records), "records")
import { writeFileSync } from 'fs';const records = [{ id: 1, name: 'Alice', role: 'engineer' },{ id: 2, name: 'Bob', role: 'designer' },{ id: 3, name: 'Charlie', role: 'manager' },];const jsonl = records.map(record => JSON.stringify(record)).join('\n');writeFileSync('output.jsonl', jsonl + '\n', 'utf-8');console.log(`Created output.jsonl with ${records.length} records`);
Manuale / Editor di Testo
Puoi anche creare file JSONL in qualsiasi editor di testo. Digita semplicemente un oggetto JSON valido per riga senza virgole tra le righe e salva il file con estensione .jsonl. Assicurati che ogni riga sia completa e JSON valido.
Come Leggere File JSONL
Poiché ogni riga è un valore JSON indipendente, leggere file JSONL è semplice come iterare sulle righe. Ecco gli approcci più comuni.
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 # skip empty linesrecord = json.loads(line)print(f"Line {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; // skip empty lineslineNumber++;const record = JSON.parse(line);console.log(`Line ${lineNumber}: ${record.name} - ${record.role}`);}
# View first 10 lineshead -n 10 data.jsonl# Count total recordswc -l data.jsonl# Pretty-print each line with jqcat data.jsonl | jq .# Filter records where role is "engineer"cat data.jsonl | jq 'select(.role == "engineer")'# Extract only the name fieldcat data.jsonl | jq -r '.name'# Search for lines containing a keywordgrep '"Alice"' data.jsonl
Come Convertire JSON in JSONL
Se hai un array JSON standard, convertire in JSONL significa scrivere ogni elemento come una riga separata. Questa è una delle operazioni JSONL più comuni.
import json# Read JSON arraywith open("data.json", "r", encoding="utf-8") as f:data = json.load(f) # expects a JSON array# Write as 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"Converted {len(data)} records from JSON to JSONL")
import { readFileSync, writeFileSync } from 'fs';// Read JSON arrayconst data = JSON.parse(readFileSync('data.json', 'utf-8'));// Write as JSONLconst jsonl = data.map(record => JSON.stringify(record)).join('\n');writeFileSync('data.jsonl', jsonl + '\n', 'utf-8');console.log(`Converted ${data.length} records from JSON to JSONL`);
Come Convertire CSV in JSONL
Convertire CSV in JSONL mappa ogni riga a un oggetto JSON, usando l'intestazione CSV come nomi di campo. Questo è utile quando si migrano dati tabulari in un formato adatto per streaming o machine learning.
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("Converted CSV to JSONL successfully")
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('Converted CSV to JSONL successfully');
Migliori Pratiche JSONL
Usa la codifica UTF-8 per tutti i file JSONL. Questo garantisce la compatibilità tra piattaforme e supporta i caratteri internazionali.
Scrivi esattamente un oggetto JSON per riga. Non dividere mai un oggetto JSON su più righe o metti più oggetti sulla stessa riga.
Non aggiungere virgole tra le righe. A differenza degli array JSON, JSONL usa i caratteri di nuova riga come unico delimitatore.
Valida ogni riga indipendentemente. Ogni riga deve essere un valore JSON completo e valido. Usa un validatore JSONL per catturare errori di sintassi in anticipo.
Usa letture in streaming per file di grandi dimensioni. Invece di caricare l'intero file in memoria, elaboralo riga per riga usando readline (Node.js) o l'iterazione dei file (Python).
Mantieni i record coerenti nella struttura. Anche se JSONL consente schemi diversi per riga, mantenere una struttura uniforme rende l'elaborazione dei dati molto più facile.
Evita spazi bianchi finali. Assicurati che le righe non abbiano spazi o tabulazioni extra che potrebbero causare problemi di analisi.
Termina il file con una nuova riga. Una nuova riga finale dopo l'ultimo record aiuta strumenti come wc e cat a gestire il file correttamente.
Errori JSONL Comuni
[
{"name":"Alice"},
{"name":"Bob"}
]{"name":"Alice"}
{"name":"Bob"}JSONL non è un array JSON. Non racchiudere le righe tra parentesi quadre o aggiungere virgole tra di esse. Ogni riga sta da sola.
{"name":"Alice"},
{"name":"Bob"},{"name":"Alice"}
{"name":"Bob"}Le virgole finali dopo ogni riga o le virgole tra le righe non sono valide in JSONL. Il carattere di nuova riga è l'unico separatore.
{
"name": "Alice",
"age": 30
}{"name":"Alice","age":30}Ogni oggetto JSON deve stare su una singola riga. JSON formattato con indentazione e interruzioni di riga non è JSONL valido.
{"text":"She said "hello""}{"text":"She said \"hello\""}Le virgolette e i caratteri speciali all'interno delle stringhe JSON devono essere correttamente escapati con barre rovesciate. Le virgolette non escapate romperanno il parser JSON.