什麼是 JSONL?JSON Lines 格式完整指南
關於 JSON Lines 您需要知道的一切 — 語法、範例、使用情境和最佳實踐。
最後更新:2026 年 2 月
什麼是 JSONL?
JSONL(JSON Lines),也稱為 Newline Delimited JSON(NDJSON),是一種基於文字的資料格式,每行都是有效的 JSON 值,以換行符分隔。與標準 JSON 將資料包裹在單一陣列或物件中不同,JSONL 每行儲存一筆記錄。
這種簡潔的設計使 JSONL 非常適合串流處理、日誌記錄和大型資料集處理 — 每行都可以獨立讀取、解析和處理,無需將整個檔案載入記憶體。
此格式因處理大量資料的工具和平台而普及,包括 OpenAI(用於微調資料集)、BigQuery、Apache Spark 和日誌管理系統。
JSONL 語法規則
JSONL 格式遵循幾條簡單的規則:
- 每行必須是有效的 JSON 值(物件、陣列、字串、數字、布林值或 null)
- 行之間以換行符(\n)分隔
- 行與行之間沒有逗號或分隔符
- 檔案必須使用 UTF-8 編碼
- 檔案末尾的換行符為選填
- 大多數解析器會忽略空行
{"name":"Alice","age":30,"city":"New York"}{"name":"Bob","age":25,"city":"London"}{"name":"Charlie","age":35,"city":"Tokyo"}
注意:每行都是完整、獨立的 JSON 物件。行與行之間沒有逗號,也沒有外部包裹陣列。
JSONL 範例
{"id":1,"name":"Alice","email":"alice@example.com"}{"id":2,"name":"Bob","email":"bob@example.com"}{"id":3,"name":"Charlie","email":"charlie@example.com"}
{"user":{"name":"Alice","age":30},"scores":[95,87,92]}{"user":{"name":"Bob","age":25},"scores":[88,91,76]}
JSONL 的每行不必是相同類型 — 每行只需要是有效的 JSON:
{"event":"login","user":"alice","timestamp":"2026-01-15T10:30:00Z"}{"event":"purchase","user":"alice","amount":29.99,"items":["book","pen"]}{"event":"logout","user":"alice","timestamp":"2026-01-15T11:45:00Z"}
JSONL 最熱門的用途之一是用於 OpenAI 微調資料集:
{"messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"What is JSONL?"},{"role":"assistant","content":"JSONL is a text format where each line is a valid JSON value."}]}{"messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"How do I read a JSONL file?"},{"role":"assistant","content":"Read the file line by line, parsing each line as JSON."}]}
如何讀取 JSONL 檔案
JSONL 檔案可以使用任何支援逐行文字處理的工具來讀取。以下是最常見的方法:
使用標準 Unix 工具檢查 JSONL 檔案:
# View first 5 lineshead -n 5 data.jsonl# Count total lines (records)wc -l data.jsonl# Pretty-print each line with jqcat data.jsonl | jq .# Filter by field valuecat data.jsonl | jq 'select(.age > 30)'
Python 內建的 json 模組原生支援 JSONL:
import jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line)print(record['name'])
在 Node.js 中逐行讀取 JSONL 檔案:
import { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.jsonl')});for await (const line of rl) {const record = JSON.parse(line);console.log(record.name);}
如何建立 JSONL 檔案
建立 JSONL 檔案非常簡單 — 只需每行寫入一個 JSON 值。
import jsonrecords = [{"name": "Alice", "age": 30},{"name": "Bob", "age": 25},{"name": "Charlie", "age": 35},]with open('output.jsonl', 'w') as f:for record in records:f.write(json.dumps(record) + '\n')
import { writeFileSync } from 'fs';const records = [{ name: 'Alice', age: 30 },{ name: 'Bob', age: 25 },{ name: 'Charlie', age: 35 },];const jsonl = records.map(r => JSON.stringify(r)).join('\n');writeFileSync('output.jsonl', jsonl + '\n');
可以在 JSONL 中新增註解嗎?
不行。JSONL 規格不支援註解。JSONL 檔案中的每一行都必須是有效的 JSON 值 — 而 JSON 本身沒有註解語法。
如果您需要在資料中包含中繼資料或註解,常見的替代方案包括:
- 1在 JSON 物件中新增中繼資料欄位:'{'"_comment": "test data", "name": "Alice"'}'
- 2在 JSONL 檔案旁使用獨立的中繼資料檔案
- 3將中繼資料作為檔案的第一行:'{'"_meta": '{'"version": "1.0", "created": "2026-01-15"'}''}'
請記住,任何「註解」欄位都會被解析為一般資料。使用 JSONL 檔案的應用程式應設計為忽略中繼資料欄位。
JSONL vs JSON
關鍵區別在於結構。JSON 將所有內容包裹在單一值中,而 JSONL 每行儲存一個值。
[{"name": "Alice", "age": 30},{"name": "Bob", "age": 25}]
{"name":"Alice","age":30}{"name":"Bob","age":25}
- JSON 必須完全載入記憶體才能解析;JSONL 可以逐行讀取
- JSON 元素之間需要逗號;JSONL 使用換行符
- JSON 更適合設定檔和 API;JSONL 更適合大型資料集和串流
- 向 JSON 追加資料需要重寫整個檔案;JSONL 只需追加新行
如需詳細比較,請查看我們的完整 JSON vs JSONL guide.
常見使用情境
機器學習與 AI
最熱門JSONL 是機器學習訓練資料的標準格式。OpenAI、Hugging Face 和其他 AI 平台使用 JSONL 進行微調資料集,因為每個訓練範例都是獨立的一行,可以高效地進行洗牌、抽樣和串流處理。
日誌檔案與事件串流
JSONL結構化日誌系統(ELK Stack、Datadog、CloudWatch)以 JSONL 格式輸出日誌。每個日誌項目佔一行 JSON,使其易於追加新項目並即時處理日誌。
大數據處理
JSONLApache Spark、BigQuery 和 AWS Athena 等工具原生支援 JSONL。逐行格式允許在分散式系統中進行平行處理 — 每個工作節點可以獨立處理一批行。
串流 API
JSONL傳回大量結果集的 API 通常使用 JSONL 串流。用戶端可以在結果到達時立即開始處理,無需等待完整回應。
JSONL 副檔名
JSONL 檔案通常使用以下副檔名:
這三種副檔名都包含相同的格式 — 每行一個 JSON 值。JSONL 的 MIME 類型為 application/jsonl 或 application/x-ndjson。