JSONL vs NDJSON:有什麼區別?
完整指南比較 JSONL(JSON Lines)和 NDJSON(Newline Delimited JSON)——兩個幾乎相同格式的名稱,但有值得了解的微妙差異。
最後更新:2026 年 2 月
快速比較:JSONL vs NDJSON
| 功能 | JSONL(JSON Lines) | NDJSON |
|---|---|---|
| 完整名稱 | JSON Lines | Newline Delimited JSON |
| 副檔名 | .jsonl | .ndjson |
| 規格 | jsonlines.org(非正式) | github.com/ndjson/ndjson-spec(非正式規格) |
| 來源 | 社群慣例,由資料科學工具推廣 | 由 Chris Olah、Thorsten Ball 等人提出 |
| 行分隔符 | \n(換行符) | \n(換行符) |
| MIME 類型 | application/jsonl(非官方) | application/x-ndjson |
| 串流支援 | 是,逐行 | 是,逐行 |
| 採用情況 | OpenAI、Hugging Face、ML/AI 生態系統 | Elasticsearch、Apache Spark、資料工程 |
什麼是 JSONL(JSON Lines)?
JSONL 是 JSON Lines 的縮寫,是一種基於文字的資料格式,其中每一行包含一個有效的 JSON 值。行之間以換行符(\n)分隔。該格式由機器學習和資料科學社群推廣,並在 jsonlines.org 上非正式定義。
JSONL 檔案使用 .jsonl 副檔名。該格式已成為 AI 和 ML 訓練資料的標準——OpenAI 要求使用 .jsonl 檔案進行微調,Hugging Face 資料集通常使用 JSON Lines 格式。
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
什麼是 NDJSON(Newline Delimited JSON)?
NDJSON,即 Newline Delimited JSON,是一種資料格式,其中每一行是一個有效的 JSON 值,以換行符分隔。該規格託管於 github.com/ndjson/ndjson-spec,旨在為換行符分隔的 JSON 資料提供更結構化的標準。
NDJSON 檔案使用 .ndjson 副檔名,並具有已註冊的 MIME 類型 application/x-ndjson。該格式在資料工程、日誌處理和串流應用程式中被廣泛採用——Elasticsearch、Apache Spark 和許多 HTTP 串流 API 都使用 NDJSON。
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
JSONL 和 NDJSON 是相同的格式嗎?
在實踐中,是的——JSONL 和 NDJSON 在功能上是相同的格式。兩者都將每行儲存一個 JSON 值,以換行符(\n)分隔。具有相同資料的 .jsonl 檔案和 .ndjson 檔案是完全可以互換的,任何能讀取其中一種格式的工具都可以讀取另一種格式。
差異純粹在於命名、社群採用和中繼資料慣例。JSONL(JSON Lines)源自資料科學和機器學習社群,而 NDJSON(Newline Delimited JSON)由資料工程和網路串流社群正式化。可以把它想像成「電影」與「影片」——同樣的東西,不同圈子的不同命名偏好。
最有意義的區別是副檔名(.jsonl vs .ndjson)和 MIME 類型。NDJSON 具有更廣泛認可的 MIME 類型(application/x-ndjson),用於 HTTP 串流上下文,而 JSONL 檔案是 AI/ML 工作流程中的標準。在選擇時,遵循您生態系統的慣例。
JSONL 和 NDJSON 之間的主要區別
1. 規格與權威性
在 jsonlines.org 上定義,具有簡潔的非正式規格。規格很直接:每一行是一個有效的 JSON 值,行之間以 '\n' 分隔,建議使用 UTF-8 編碼。
在 github.com/ndjson/ndjson-spec 上定義,具有稍微正式的規格。NDJSON 明確要求每一行是有效的 JSON 值,行分隔符是 '\n'(而不是 '\r\n'),建議使用尾隨換行符。
2. 副檔名
使用 .jsonl 副檔名。這是 OpenAI 微調檔案、Hugging Face 資料集和大多數 ML/AI 工具的標準。GitHub 和 VS Code 可以識別 .jsonl 檔案並提供語法高亮。
使用 .ndjson 副檔名。這在資料工程工具、Elasticsearch bulk API 和串流 HTTP 回應中很常見。許多編輯器也支援 .ndjson 語法高亮。
3. MIME 類型
沒有正式註冊的 MIME 類型。常見的非官方類型包括 application/jsonl 和 application/json-lines。在實踐中,許多系統使用 application/jsonl 或回退到 application/json。
使用 application/x-ndjson 作為其 MIME 類型。這在 HTTP 上下文中更被廣泛認可,並被 Elasticsearch、Fetch API 串流標準和各種 Web 框架用於串流回應。
4. 社群與生態系統採用
在 AI/ML 生態系統中佔主導地位。OpenAI、Anthropic、Google Gemini、Hugging Face 和大多數 ML 框架使用 .jsonl。術語「JSONL」在開發者社群中被更廣泛搜尋和認可。
在資料工程和後端系統中更受青睞。Elasticsearch、Apache Spark、PostgreSQL COPY 和許多日誌聚合工具使用 NDJSON。ndjson npm 套件每週有數百萬次下載。
何時使用 JSONL vs NDJSON
- 為 OpenAI、Anthropic 或其他 LLM 微調準備訓練資料
- 使用 Hugging Face 資料集
- 建置 ML 管線和資料前處理
- 您的團隊或文件提到「JSON Lines」
- 上傳檔案到期望 .jsonl 副檔名的 AI/ML 平台
- 在 Python 資料科學環境中工作
- 透過 HTTP 串流 JSON 資料(Server-Sent Events、fetch 串流)
- 使用 Elasticsearch bulk API
- 使用 Apache Spark 或類似工具建置資料管線
- 設定 Content-Type 標頭(application/x-ndjson)
- 您的基礎設施或團隊使用 NDJSON 慣例
- 使用 Node.js 串流函式庫
程式碼範例:讀取 JSONL 和 NDJSON
# 讀取 JSONL - 與讀取 NDJSON 完全相同import jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line.strip())print(record['text'])# 輸出:# Hello world# How are you?# Goodbye
// 讀取 NDJSON - 與讀取 JSONL 完全相同import { 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);}// 輸出:// Hello world// How are you?// Goodbye