JSONL vs NDJSON: Qual è la Differenza?
Una guida completa che confronta JSONL (JSON Lines) e NDJSON (Newline Delimited JSON) — due nomi per quasi lo stesso formato, con sottili differenze che vale la pena conoscere.
Ultimo aggiornamento: febbraio 2026
Confronto Rapido: JSONL vs NDJSON
| Caratteristica | JSONL (JSON Lines) | NDJSON |
|---|---|---|
| Nome Completo | JSON Lines | Newline Delimited JSON |
| Estensione File | .jsonl | .ndjson |
| Specifica | jsonlines.org (informale) | github.com/ndjson/ndjson-spec (specifica informale) |
| Origine | Convenzione della comunità, popolarizzata da strumenti di data science | Proposto da Chris Olah, Thorsten Ball e altri |
| Delimitatore di Riga | \n (newline) | \n (newline) |
| Tipo MIME | application/jsonl (non ufficiale) | application/x-ndjson |
| Supporto Streaming | Sì, riga per riga | Sì, riga per riga |
| Adozione | OpenAI, Hugging Face, ecosistema ML/AI | Elasticsearch, Apache Spark, data engineering |
Cos'è JSONL (JSON Lines)?
JSONL, abbreviazione di JSON Lines, è un formato di dati basato su testo in cui ogni riga contiene un singolo valore JSON valido. Le righe sono separate da caratteri di nuova riga (\n). Il formato è stato popolarizzato dalle comunità di machine learning e data science, ed è definito informalmente su jsonlines.org.
I file JSONL utilizzano l'estensione .jsonl. Il formato è diventato lo standard per i dati di addestramento AI e ML — OpenAI richiede file .jsonl per il fine-tuning, e i dataset di Hugging Face utilizzano comunemente il formato JSON Lines.
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
Cos'è NDJSON (Newline Delimited JSON)?
NDJSON, o Newline Delimited JSON, è un formato di dati in cui ogni riga è un valore JSON valido separato da caratteri di nuova riga. La specifica è ospitata su github.com/ndjson/ndjson-spec ed è stata formalizzata per fornire uno standard più strutturato per dati JSON delimitati da riga.
I file NDJSON utilizzano l'estensione .ndjson e hanno un tipo MIME registrato application/x-ndjson. Il formato è ampiamente adottato nel data engineering, nell'elaborazione dei log e nelle applicazioni di streaming — Elasticsearch, Apache Spark e molte API HTTP streaming utilizzano NDJSON.
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
JSONL e NDJSON Sono lo Stesso Formato?
In pratica, sì — JSONL e NDJSON sono formati funzionalmente identici. Entrambi memorizzano un valore JSON per riga, separati da caratteri di nuova riga (\n). Un file .jsonl e un file .ndjson con gli stessi dati sono completamente intercambiabili, e qualsiasi strumento che legge un formato può leggere l'altro.
Le differenze sono puramente nel nome, nell'adozione della comunità e nelle convenzioni di metadati. JSONL (JSON Lines) è emerso dalla comunità di data science e machine learning, mentre NDJSON (Newline Delimited JSON) è stato formalizzato dalla comunità di data engineering e web streaming. Pensalo come "movie" vs "film" — stessa cosa, preferenze di nome diverse in cerchie diverse.
La differenza più significativa è l'estensione del file (.jsonl vs .ndjson) e il tipo MIME. NDJSON ha un tipo MIME più ampiamente riconosciuto (application/x-ndjson) che viene utilizzato in contesti di streaming HTTP, mentre i file JSONL sono lo standard nei flussi di lavoro AI/ML. Quando scegli tra loro, segui la convenzione del tuo ecosistema.
Differenze Chiave tra JSONL e NDJSON
1. Specifica e Autorità
Definito su jsonlines.org con una specifica concisa e informale. La specifica è semplice: ogni riga è un valore JSON valido, le righe sono separate da '\n' e si raccomanda la codifica UTF-8.
Definito su github.com/ndjson/ndjson-spec con una specifica leggermente più formale. NDJSON richiede esplicitamente che ogni riga sia un valore JSON valido e che il separatore di riga sia '\n' (non '\r\n'), con una nuova riga finale raccomandata.
2. Estensione File
Utilizza l'estensione .jsonl. Questo è lo standard per i file di fine-tuning di OpenAI, i dataset di Hugging Face e la maggior parte degli strumenti ML/AI. GitHub e VS Code riconoscono i file .jsonl con evidenziazione della sintassi.
Utilizza l'estensione .ndjson. Questo è comune negli strumenti di data engineering, nelle API bulk di Elasticsearch e nelle risposte HTTP streaming. Molti editor supportano anche l'evidenziazione della sintassi .ndjson.
3. Tipo MIME
Nessun tipo MIME registrato ufficialmente. I tipi non ufficiali comuni includono application/jsonl e application/json-lines. In pratica, molti sistemi utilizzano application/jsonl o ricadono su application/json.
Utilizza application/x-ndjson come tipo MIME. Questo è più ampiamente riconosciuto in contesti HTTP ed è utilizzato da Elasticsearch, dallo standard Fetch API streaming e da vari framework web per risposte streaming.
4. Adozione della Comunità e dell'Ecosistema
Dominante nell'ecosistema AI/ML. OpenAI, Anthropic, Google Gemini, Hugging Face e la maggior parte dei framework ML utilizzano .jsonl. Il termine 'JSONL' è più comunemente cercato e riconosciuto nella comunità degli sviluppatori in generale.
Preferito nel data engineering e nei sistemi backend. Elasticsearch, Apache Spark, PostgreSQL COPY e molti strumenti di aggregazione log utilizzano NDJSON. Il pacchetto npm ndjson ha milioni di download settimanali.
Quando Usare JSONL vs NDJSON
- Prepari dati di addestramento per OpenAI, Anthropic o altri fine-tuning di LLM
- Lavori con dataset di Hugging Face
- Costruisci pipeline ML e preprocessing dei dati
- Il tuo team o la documentazione si riferiscono a 'JSON Lines'
- Carichi file su piattaforme AI/ML che si aspettano l'estensione .jsonl
- Lavori in ambienti Python di data science
- Fai streaming di dati JSON su HTTP (Server-Sent Events, fetch streaming)
- Lavori con l'API bulk di Elasticsearch
- Costruisci pipeline di dati con Apache Spark o strumenti simili
- Imposti intestazioni Content-Type (application/x-ndjson)
- La tua infrastruttura o il tuo team utilizza la convenzione NDJSON
- Lavori con librerie di streaming Node.js
Esempi di Codice: Leggere JSONL e NDJSON
# Reading JSONL - exactly the same as reading NDJSONimport jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line.strip())print(record['text'])# Output:# Hello world# How are you?# Goodbye
// Reading NDJSON - exactly the same as reading JSONLimport { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.ndjson')});for await (const line of rl) {const record = JSON.parse(line);console.log(record.text);}// Output:// Hello world// How are you?// Goodbye