SheepDev

資料格式與結構化資料

將 JSON 轉成 CSV 表格檢視

使用工具

產生檔案容易讓人以為只換格式,但表與樹、文字與數值、值與註解攜帶的資訊不同。無錯誤不保證意義全保留,選目標格式前先確定必須保留什麼。

先做小型 JSON/CSV 往返,再看 YAML 註解和 TOML 的 null 缺失。完整業務資料轉換前,用包含前導零、空字串、缺欄位、巢狀的幾筆紀錄明確規則。

保住 001,不等於保住所有型別

轉 CSV 的 JSON 輸入
[{"id":"001","quantity":2,"active":true}]

CSV 產生 id、quantity、active 欄,轉回 JSON 時儲存格都是字串。001 保住了,2 和 true 也成字串。工具不按外觀猜型別,因此往返不保留原 JSON 型別。

轉回後的值
[{"id":"001","quantity":"2","active":"true"}]

若自動轉換所有像數值的儲存格,001 又可能變 1。還原型別需要與接收方約定欄規則,如 id 文字、quantity 整數、active 用指定真假表示。不能指望 CSV 獨自還原原型別。

null、空字串、缺欄位會變成同樣空欄

三種無值狀態
[
  {"id":"a","note":null},
  {"id":"b","note":""},
  {"id":"c"}
]

CSV 中 note 都變空白,轉回無法判斷原來是 null、空字串還是缺失。保留區別需明確約定,如另設狀態欄。把空白都改 null 會改變另兩種意義。

更新介面可能把缺欄位當不修改、null 當清空,若如此,丟掉區別很重要。先查實際匯入或 API 規則,再決定哪些欄位可走 CSV,不把語意決定交給按鈕。

巢狀放一個儲存格,還是展開成欄?

巢狀輸入
[{"id":"a","profile":{"city":"Tokyo"}}]

拒絕巢狀模式會拒絕轉換;字串化把 profile 作為 JSON 文字放一格,展開則產生 profile.city 欄。兩者都是表格表示,不是表格原生保留巢狀型別。

反向轉換不會把 JSON 樣式儲存格再解析為物件,也不會從 profile.city 自動重建 profile。原鍵本就含點時也需約定。應按接收方預期選擇,不憑外觀以為可逆。

逗號與換行也可能在儲存格內

用引號保護的 CSV 儲存格
id,note
001,"red, blue"
002,"first line
second line"

此 CSV 除表頭外有兩筆紀錄。按逗號或換行盲拆會把 note 內容拆成額外列欄。用表格預覽確認 red, blue 一格、兩行 note 也一格。實體行數不等於紀錄數。

試算表公式防護會給相關儲存格加前導單引號,改變文字。需區分顯示保護與無損交換,並告知接收方是否啟用,避免把前綴當原資料匯入。

YAML 註解不會成為 JSON 值

帶說明的 YAML
# Retry only temporary failures
retries: 3
enabled: true

JSON 保留 retries、enabled,不保留註解。僅因值可轉換就往返設定,可能遺失維運理由和注意事項。註解重要時,應保留原 YAML 或另設文件策略。

拒絕轉換有時才正確

TOML 沒有直接對應 JSON null 的值,所以工具拒絕含 null 的 JSON。改空字串或刪欄位也許可輸出,但會改意義,不應只為成功而自動替換。

大整數與日期也依賴目標型別與實作範圍。目前 JSON→TOML 拒絕超出精確範圍的整數。型別日期變 JSON 文字時,要確認時間與時區意義仍清楚,格式名稱不保證完全可逆。

往返測試用於發現轉換約定

最後結構比較原 JSON 與返回 JSON,關注型別、null、缺失、巢狀而非鍵順序。不同不必然失敗,允許的轉換可記錄為規格;不可接受的損失則換格式或補中繼資料。

同時記錄欄選擇、巢狀模式、公式保護與編碼。應說明保留與改變了什麼,而非聲稱來自 JSON 所以相同。轉換只是交接一步,接收方仍需按預期理解。

交換前先約定空欄位的含義

接收方把 CSV 空欄當不修改,傳送方卻想刪除值,即使無亂碼或語法錯也會不一致。壓成表格前應約定空字串、null、未指定的區別。加狀態欄或選其他格式屬於交接設計,產生有效檔案與共享同一含義需要分別驗證。

參考資料

使用工具

指南 →