一位 DevOps 工程師將 Kubernetes 設定匯出為 YAML,但需要傳送給一個只接受 JSON 的 API。一位分析師收到 JSON 格式的 API 回應資料,但需要在試算表中使用。一位資料科學家從資料庫匯出 CSV,但需要結構化的 JSON 來建立網頁儀表板。
格式轉換不僅僅是機械性的操作。每種格式都有不同的取捨,了解轉換中丟失了什麼和知道如何轉換同樣重要。
三種格式,三種哲學
每種格式是為不同的受眾和不同的問題而設計的:
| 格式 | 誕生年份 | 設計用途 | 核心哲學 |
|---|---|---|---|
| CSV | 約 1972 | 程式間的資料交換 | 極致簡潔——只有列和欄 |
| JSON | 2001 | 網路資料交換 | 具有嚴格規則的機器可讀結構化資料 |
| YAML | 2001 | 組態檔案 | 語法極簡的人類可讀結構化資料 |
CSV 假設你的資料是平面表格。每個值都是字串。沒有巢狀、型別或中繼資料的概念。
JSON 假設你的資料有結構——物件、陣列、型別(字串、數字、布林值、null)。它嚴格且無歧義,這使其非常適合機器,但對人類而言冗長。
YAML 假設會有人類閱讀和編輯檔案。它使用縮排而非大括號,支援註解,語法更寬鬆。技術上,YAML 是 JSON 的超集——任何有效的 JSON 文件也是有效的 YAML。
YAML 是 JSON 的超集 你可以直接將 JSON 文件貼入 YAML 解析器,它會正常運作。反過來則不行——YAML 的註解、錨點和多行字串等功能在 JSON 中沒有對應。
真實的轉換場景
組態遷移(JSON 轉 YAML、YAML 轉 JSON)
這是最常見的轉換。不同工具期望不同的組態格式:
- Docker Compose、Kubernetes、GitHub Actions、Ansible 使用 YAML
- package.json、tsconfig.json、ESLint 使用 JSON
- 在工具之間遷移通常意味著轉換組態
這種轉換在資料內容方面雙向無損——但 YAML 的註解在轉換為 JSON 時會丟失,因為 JSON 沒有註解語法。
資料分析(JSON 轉 CSV)
API 回應以 JSON 格式返回。分析師需要試算表。這種轉換對扁平 JSON 陣列效果很好——具有相同鍵的物件陣列可以自然地映射為列和欄。
但遇到巢狀資料就會出問題。一個帶有 address.city 欄位和 skills 陣列的 JSON 物件沒有天然的 CSV 表示。轉換器必須選擇:展平巢狀鍵(address.city 變成一欄)、將巢狀值序列化為字串,或丟棄它們。
資料匯入(CSV 轉 JSON)
相反的場景:將試算表資料匯入網路應用程式或 API。CSV 轉 JSON 會建立一個物件陣列,欄標題作為鍵。問題在於 CSV 沒有型別資訊——數字 42、字串 "42" 和布林值 true 在 CSV 中都只是文字。轉換器必須猜測型別。
人類可讀性(JSON 轉 YAML)
有時你只是需要讓一個密集的 JSON 組態檔案變得可讀。轉換為 YAML 會給你整潔的縮排和添加註解用於文件說明的能力。這對於團隊維護的大型組態檔案特別有價值。
轉換中丟失了什麼
這是節省除錯時間的關鍵知識:
| 轉換 | 丟失了什麼 |
|---|---|
| YAML 轉 JSON | 註解(JSON 沒有註解語法) |
| JSON 轉 CSV | 巢狀(CSV 是扁平的)、型別(一切變成文字)、陣列 |
| CSV 轉 JSON | 無(但型別必須推斷——"42" vs 42) |
| CSV 轉 YAML | 無(同樣的型別推斷問題) |
| JSON 轉 YAML | 無(YAML 是 JSON 的超集) |
| YAML 轉 CSV | 註解、巢狀、型別、錨點/別名 |
規律很明顯:轉向 CSV 的轉換丟失最多資訊,因為 CSV 是最簡單的格式。JSON 和 YAML 之間的轉換幾乎無損。而 YAML 的註解在離開 YAML 時總會丟失。
雙向 vs 單向 JSON 轉 YAML 和 YAML 轉 JSON 實際上是雙向的(往返安全,除了註解)。JSON 轉 CSV 和 YAML 轉 CSV 對於複雜資料是單向的——你無法從扁平 CSV 重建巢狀結構。
轉換時的常見陷阱
YAML 的型別強制轉換陷阱
YAML 會自動將某些字串解釋為非字串型別。單詞 no 變成布林值 false。yes 變成 true。字串 1.0 變成浮點數。國家代碼如 NO(挪威)因此引發了著名的錯誤。在 YAML 中始終為模稜兩可的值加引號。
CSV 分隔符和編碼混亂
並非所有 CSV 都使用逗號。歐洲的 CSV 通常使用分號(因為許多歐洲數字格式中逗號是小數分隔符)。制表符分隔值(TSV)是另一種變體。字元編碼不匹配(UTF-8 vs Latin-1)會產生亂碼的重音字元。
JSON 的尾隨逗號問題
JSON 不允許尾隨逗號。這在 JavaScript 中是有效的:{"a": 1, "b": 2,} ——但它不是有效的 JSON。一個尾隨逗號就會導致解析錯誤。
大型資料集效能
對於包含數百萬列的資料集,CSV 比 JSON 或 YAML 效率高得多。JSON 為每個值添加大括號、方括號和引號。一個有 100 萬列的 CSV 可能是 50 MB;等效的 JSON 可能是 150 MB。
從一開始就選擇正確的格式
與其事後轉換,不如一開始就選擇正確的格式以避免資訊丟失:
- 用於試算表或資料庫的表格資料 ——CSV
- 用於 API 或網路應用程式的結構化資料 ——JSON
- 人類會編輯的組態 ——YAML
- 帶有註解的複雜巢狀資料 ——YAML
- 系統間的資料交換 ——JSON
延伸閱讀
使用瀏覽器工具即時在 JSON、YAML 和 CSV 之間轉換:
- 轉換資料格式 ——貼上你的資料,選擇目標格式,下載結果
- JSON 格式化器 ——驗證、格式化和壓縮 JSON
- JSON 轉 CSV 轉換器 ——將 JSON 陣列轉換為試算表可用的 CSV
- YAML-JSON 轉換器 ——在 YAML 和 JSON 之間轉換,具備註解感知功能
