精通 JSONL 檔案:結構、使用案例與核心優勢

JSONL 檔案每行包含一個完整的 JSON 值。官方文件稱其為「JSON Lines 文字格式,也稱為換行符號分隔的 JSON」。正是這條單一規則,使其非常適合串流傳輸、能在部分讀取時存活,且試算表軟體無法直接開啟它。
什麼是 JSONL 檔案?
JSON Lines 是一種用於記錄的文字格式。技術規格將其描述為「一種便於儲存結構化資料的格式,可以一次處理一筆記錄」。
官方文件明確指出其適用場景。它「非常適合與 Unix 風格的文字處理工具和 Shell 管道配合使用」,且該頁面補充說明「它是日誌檔案的絕佳格式」。它也被描述為「在協作程序之間傳遞訊息的彈性格式」。
與一般 JSON 的對比正是關鍵所在。一個包含百萬筆記錄的 JSON 陣列是一個單一的值:讀取器必須吞下整個檔案,結構才算完整。而一個包含百萬筆記錄的 JSONL 檔案則是百萬個值,且每一行都是獨立存在的。
還有第二個密切相關的規格。NDJSON 規格對此非常直接:「目前尚無在串流協定中傳輸 JSON 文字實例的標準。」其說明的應用場景是「透過 TCP 或 UNIX 管道等串流協定傳遞多個 JSON 文字實例」。
JSONL 檔案的結構
三大要求
JSON Lines 文件剛好列出了三點。第一點是UTF-8 編碼。它帶有一個借鑑自 JSON 本身的警告:「與 JSON 標準一樣,絕不能包含位元組順序記號 (U+FEFF)。」
第二點是每一行都必須是有效的 JSON 值。該頁面指出「最常見的值會是物件或陣列,但允許任何 JSON 值。」接著它給出了一個容易讓人出錯的邊緣案例:「null 是有效的值,但空白行不是。」
第三點是行尾結束符號為 \n。Windows 的行尾結束符號仍然有效。給出的技術原因為:「這意味著 \r\n 也受到支援,因為在解析 JSON 值時,周圍的空白字元會被隱式忽略。」
行內絕不能出現的內容
這是使該格式得以運作的限制。NDJSON 規格將其列為一項要求:「JSON 文字絕不能包含換行符號或歸位字元。」
一般的 JSON 值通常允許透過縮排跨越多行。但在以行分隔的檔案中則不行,因為換行符號是記錄的分隔器。每筆記錄都必須寫在單一的實體行上。
最後一行與空白行
這兩個規格之間有兩個細節不同,且在檔案被拒絕解析時,這兩點都很重要。
以結尾的換行符號為例。JSON Lines 表示「強烈建議但在檔案中最後一個 JSON 值之後包含行尾結束符號並非強制要求。」
在空白行方面,這兩個規格的意見不一。JSON Lines 非常嚴格:空白行不是有效的值。NDJSON 則較為寬容,允許「解析器可以靜默忽略空白行」,但要求「此行為必須記錄在文件中」。
副檔名與媒體類型
命名方面也有分歧。JSON Lines 表示檔案「可以儲存為副檔名 .jsonl」。在媒體類型方面,它表示「MIME 類型可以是 application/jsonl,但這尚未標準化」。NDJSON 則表示媒體類型「應該為 application/x-ndjson」,且副檔名「應該為 .ndjson」。
對於壓縮,JSON Lines 推薦使用串流壓縮器:「建議使用 gzip 或 bzip2 以節省空間,從而產生 .jsonl.gz 或 .jsonl.bz2 檔案。」
在閱讀錯誤訊息時,有一項小慣例值得了解。文字編輯器將第一行稱為「第 1 行」。官方文件對此進行了延伸:「JSON Lines 檔案中的第一個值也應該被稱為『值 1』。」
JSONL 的用途
您通常會在以下四種情況之一遇到 .jsonl 檔案。
日誌與事件檔案。 該格式本身的官方文件就點名了日誌檔案,原因在於寫入器可以一次附加一行,而無需重寫任何內容。
資料倉儲載入。 Google 的 BigQuery 文件是該格式官方地位的一個很好範例。它支援從 Cloud Storage 載入「換行符號分隔的 JSON (ndJSON) 資料」,且其檔案格式選取器將該選項列為「JSONL (換行符號分隔的 JSON)」。
巢狀記錄的 API 匯出。 無法乾淨地扁平化為資料行的資料,會在每行中保留其巢狀結構。包含變動項目數量的訂單明細就是經典案例。
機器學習資料集。 訓練集和評估集通常以這種方式發布,因為訓練迴圈會一次讀取一筆記錄。
共同的特點是串流傳輸。當檔案是漸進式產生或漸進式使用時,它就成為了顯而易見的選擇。
JSONL、JSON 與 CSV 的比較
| JSONL | JSON | CSV | |
|---|---|---|---|
| 檔案單位 | 每行一個值 | 整個檔案為一個值 | 每行一列 |
| 巢狀資料 | 是,每筆記錄 | 是 | 原生不支援 |
| 附加記錄 | 新增一行 | 重寫容器 | 新增一列 |
| 部分讀取是否實用 | 是 | 極少 | 是 |
| 可在試算表軟體中開啟 | 否 | 否 | 通常可以 |
| 記錄結構可能不同 | 是 | 是 | 否,資料行是固定的 |
| 在編輯器中具備人類可讀性 | 是,每筆為一長行 | 是,縮排時 | 是 |
最讓人感到意外的是倒數第二列。同一個 JSONL 檔案中的兩行可以攜帶不同的鍵。這正是該格式靈活的原因,也正是為什麼簡單直接的匯入會產生不整齊的資料行。
對於以資料行為導向的二進位替代方案,Parquet 說明指南從儲存的角度涵蓋了相同的領域。對於最簡單的表格案例,TSV 解析則介紹了以定位鍵分隔的文字。
主要優勢
僅限附加寫入。 新記錄即為新的一行。檔案中先前的内容完全不需要更改。
串流讀取。 使用者可以在寫入第兩百萬筆記錄之前,就先處理第一筆記錄。
容錯能力。 即使檔案被截斷,在最後一個完整行之前仍可讀取。而截斷的 JSON 陣列通常會完全無法讀取。
保留巢狀結構。 CSV 必須扁平化的結構,在每筆記錄中都能保持完整。
對 Shell 友善。 官方文件歸功於 Unix 風格的文字處理和 Shell 管道,因為以行為導向的檔案可以與以行為導向的工具完美配合。
資料倉儲支援。 BigQuery 的文件說明了其強制執行的規則:「檔案中的每個 JSON 物件必須位於單獨的行中。」
JSONL 的局限性
該格式解決了傳輸和附加的問題。但它無法解決您對內容的任何疑問。
壓縮是一項真正的權衡,而非無痛的勝利。BigQuery 的文件直言不諱地指出其代價:「如果您使用 gzip 壓縮,BigQuery 將無法平行讀取資料。」它還補充說明「將壓縮的 JSON 資料載入到 BigQuery 比載入未壓縮的資料慢」。該格式本身的頁面則建議使用 gzip 來節省空間。兩者都是事實,但它們的方向背道而馳。
它也相當冗長。每一行都會重複每個鍵名,因此寬記錄集會比資料行格式的相同資料大得多。
而且它對一致性隻字未提。它允許不同結構的記錄,這意味著某個欄位可以在檔案中途悄然消失,而不會導致任何內容失效。
非工程師如何處理 JSONL 檔案
這就是實際上的落差。商業工具預期的是列與行,而 .jsonl 檔案無法像 CSV 那樣直接開啟。
務實的做法是進行轉換。向產生該檔案的人索取您所需欄位的扁平化 CSV 或 Excel 匯出檔。或者,您也可以使用任何支援 JSON 的工具自行將其扁平化。您會失去巢狀結構,但一旦您決定了分析要使用哪些欄位,這通常就無關緊要了。
從那裡開始,工作就是一般的分析。Powerdrill Bloom 的定價頁面列出了 Excel、CSV、PDF 和文件的上傳支援,因此扁平化的匯出檔可以直接匯入。您可以使用自然語言提問,而無需撰寫查詢語句。CSV AI assistant 涵蓋了這條路徑,而 data connectors 則適用於直接從來源提取資料比匯出資料更好的情況。
值得記住的區別是,這是您上游做出的傳輸決策。當檔案到達您的辦公桌時,將其轉換掉是正常的做法,而不是一種權宜之計。
結論
JSONL 是一種只有一條規則的文字格式:每行一個完整的 JSON 值,且值內部不能有換行符號。這條規則換來了可附加性、串流傳輸和部分讀取容錯能力,這也是為什麼日誌和資料倉儲載入預設使用它的原因。
但它換不來表格。當檔案到達需要答案而非資料管道的人手中時,下一個有用的步驟就是扁平化匯出並提出問題。
如果這正是您面臨的處境,請使用轉換後的檔案嘗試 Powerdrill Bloom,並從將其轉換為圖表開始。
常見問題
JSONL 檔案有什麼用途?
它用於記錄串流:日誌檔案、事件匯出、資料倉儲載入和機器學習資料集。該格式的官方文件特別點名了日誌檔案和 Shell 管道。共同點在於記錄是一次寫入或讀取一筆。
JSONL 和 NDJSON 有什麼不同?
它們用不同的規範描述了同一個概念。JSON Lines 使用 .jsonl 副檔名,並指出 application/jsonl 尚未標準化。NDJSON 則指定了 .ndjson 和 application/x-ndjson,且允許解析器忽略空白行。
我可以在 Excel 中開啟 JSONL 檔案嗎?
無法透過按兩下直接開啟,因為每一行都是一個 JSON 值,而不是一列儲存格。通常的做法是先將您需要的欄位扁平化為 CSV 或 Excel,或者使用直接讀取該格式的工具。
為什麼在 JSONL 中一筆記錄不能跨越多行?
因為換行字元是記錄的分隔器。NDJSON 規格指出「JSON 文字絕不能包含換行符號或歸位字元」。因此,美化排版的 JSON 必須被壓縮為每筆記錄一行。
JSONL 檔案中允許空白行嗎?
這兩個規格有所不同。JSON Lines 指出「null 是有效的值,但空白行不是」。NDJSON 則允許解析器靜默忽略空白行,前提是該行為必須記錄在文件中。