JSON Lines(JSONL)⇔ JSON 陣列 互相轉換
在每行一個 JSON 物件的 JSON Lines 格式與普通 JSON 陣列之間互相轉換,方便檢視機器學習資料集和日誌輸出。
使用提示
- JSON Lines(JSONL)是每行排列一個獨立 JSON 物件的格式,廣泛用於 OpenAI 微調資料集以及 Elasticsearch/Logstash 的日誌輸出等場景。
- 在"JSONL → JSON 陣列"模式下,每一行都必須是可單獨解析的 JSON 物件,空行會被自動跳過。
- 在"JSON 陣列 → JSONL"模式下,整個輸入必須是一個 JSON 陣列(`[ ... ]`),陣列中的每個元素會作為一行 JSONL 輸出。
- 將大型日誌檔案從 JSONL 轉換為 JSON 陣列後,用 `jq` 命令或各程式語言的標準 JSON 陣列解析器處理起來會更加方便。
常見問題
JSON 陣列會用 `[ {...}, {...} ]` 這樣的形式把整體包裹成一個數組,如果不解析整體就無法訪問單個元素。而 JSON Lines 是每行排列一個獨立的 JSON 物件,可以逐行進行流式處理,因此更適合對超大日誌檔案或機器學習資料集進行逐條處理。
常見於 OpenAI 及其他機器學習平臺的微調資料集、Elasticsearch、Logstash 等日誌採集工具的輸出格式,以及需要逐條獨立讀寫的大規模資料流式處理場景。
在"JSONL → JSON 陣列"模式下,每一行都必須是獨立有效的 JSON,哪怕只有一行存在語法錯誤,也會顯示包含該行號的錯誤資訊。在"JSON 陣列 → JSONL"模式下,整個輸入必須是陣列格式(以 `[` 開頭、以 `]` 結尾)。
轉換為 JSON 陣列的結果可以直接用 `jq` 命令或各程式語言的標準 JSON 解析器處理。反之,轉換為 JSONL 的結果與 `jq -c`、`grep`、`awk` 等按行處理的工具契合度很高,便於納入日誌分析流水線。
閒話 ― 為什麼會誕生"一行一條記錄"這種格式
JSON Lines(也稱 JSONL)這種格式誕生的背景,是因為普通的 JSON 陣列存在一個限制:在把整體讀入記憶體並解析完畢之前,無法取出哪怕一條中間資料。如果試圖用 JSON 陣列處理多達數百萬行的日誌資料或機器學習訓練資料集,就必須把整個檔案展開到記憶體中,對於超大檔案來說,這會帶來記憶體不足和解析耗時激增的問題。
JSON Lines 用"一行 = 一個完整的 JSON 物件"這樣簡單的約束解決了這個問題。由於可以一邊逐行讀取檔案一邊隨即解析,無需把整個檔案讀入記憶體,因此與流式處理、並行處理非常契合。這種設計理念也與 Unix 系統傳統的"一行一條記錄"文本處理文化(`grep`、`awk`、`sed` 等命令都按行工作)高度親和,可以直接嵌入現有的命令列工具鏈,這在實用層面也是很大的優勢。
如今它已被廣泛採用為 AI、機器學習領域的資料集分發格式,大語言模型的訓練資料以及用於微調的提示/回覆對,以 JSON Lines 格式分發的情況已相當普遍。