資料

CSV、JSON 與 YAML

三種格式承載了世界上大部分的結構化資料。在它們之間轉換很容易,但要在轉換時不悄悄損壞任何東西,則需要一點細心。

發布於

各自的用途

CSV 是表格:只有列與欄,沒有別的。它人人都能讀、體積極小,但無法表達任何巢狀結構。JSON 是樹狀結構(物件裡有陣列、陣列裡又有物件),幾乎所有網路 API 都使用它。YAML 表達的結構與 JSON 相同,但以縮排取代大括號,讓人類讀寫起來愉快得多,這也是設定檔逐漸轉向它的原因。

型別強制轉換的陷阱

這是真正會讓人損失金錢的一項。CSV 只包含文字,沒有任何方式能把某個值標示為數字、日期或字串。所以轉換器會用猜的,而猜測常常出錯:

  • 像 01234 這樣的郵遞區號會變成數字 1234,失去開頭的零。
  • 像 1-2 這樣的產品代碼會變成日期。
  • 很長的帳號會被轉成浮點數,並失去最後幾位數。
  • 代表北美洲的 NA 會變成「不適用」。

這每一種都是悄悄發生的。這就是為什麼謹慎的 CSV 轉 JSON 應該讓每個值都維持為字串,由您自己決定,本站的轉換器就是刻意這麼做的,即使乍看之下有點吹毛求疵。

轉成 CSV 時無法保留的內容

巢狀結構。由扁平物件組成的 JSON 陣列會變成乾淨的表格。但一旦某個值本身是物件或陣列,就沒有欄位可以放它了。選項有三:用複合鍵攤平、把巢狀部分重新序列化成儲存格內的文字,或是捨棄,而悄悄捨棄是三者中最糟的。把它以 JSON 文字寫回儲存格中,至少能讓資料保持可復原。

YAML 的尖銳之處

YAML 讀起來舒服,卻異常容易寫錯。

  • 縮排就是結構,而且不允許使用 Tab。錯放的空格會改變意義,而不是引發錯誤。
  • 有些裸字會被當成布林值。在較舊的 YAML 中,y、n、on、off、yes 與 no 都會被解析成 true 或 false,所以國家欄位中代表挪威的 NO 會變成 false。請加上引號。
  • 轉成 JSON 時註解會消失,因為 JSON 無法表示註解。

來回轉換不保證一致

把 JSON 轉成 YAML 再轉回來,通常會回到您開始時的樣子。把 CSV 轉成 JSON 再轉回來,通常就不會:引號風格、各筆形狀不同的記錄的欄位順序,以及空值的表示法,都是各工具自行選擇的結果。如果來回轉換必須完全一致,請加以驗證,而不要假設。

若要在它們之間轉換:將 CSV 轉成 JSON、將 JSON 轉成 CSV,或將 JSON 轉成 YAML,並檢查結果,因為來回轉換並不總是完全一致。