資料格式與結構化資料
將 JSON 轉成 CSV 表格檢視
使用工具
產生檔案容易讓人以為只換格式,但表與樹、文字與數值、值與註解攜帶的資訊不同。無錯誤不保證意義全保留,選目標格式前先確定必須保留什麼。
先做小型 JSON/CSV 往返,再看 YAML 註解和 TOML 的 null 缺失。完整業務資料轉換前,用包含前導零、空字串、缺欄位、巢狀的幾筆紀錄明確規則。
保住 001,不等於保住所有型別
[{"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。原鍵本就含點時也需約定。應按接收方預期選擇,不憑外觀以為可逆。
逗號與換行也可能在儲存格內
id,note
001,"red, blue"
002,"first line
second line"此 CSV 除表頭外有兩筆紀錄。按逗號或換行盲拆會把 note 內容拆成額外列欄。用表格預覽確認 red, blue 一格、兩行 note 也一格。實體行數不等於紀錄數。
試算表公式防護會給相關儲存格加前導單引號,改變文字。需區分顯示保護與無損交換,並告知接收方是否啟用,避免把前綴當原資料匯入。
YAML 註解不會成為 JSON 值
# Retry only temporary failures
retries: 3
enabled: trueJSON 保留 retries、enabled,不保留註解。僅因值可轉換就往返設定,可能遺失維運理由和注意事項。註解重要時,應保留原 YAML 或另設文件策略。
拒絕轉換有時才正確
TOML 沒有直接對應 JSON null 的值,所以工具拒絕含 null 的 JSON。改空字串或刪欄位也許可輸出,但會改意義,不應只為成功而自動替換。
大整數與日期也依賴目標型別與實作範圍。目前 JSON→TOML 拒絕超出精確範圍的整數。型別日期變 JSON 文字時,要確認時間與時區意義仍清楚,格式名稱不保證完全可逆。
往返測試用於發現轉換約定
最後結構比較原 JSON 與返回 JSON,關注型別、null、缺失、巢狀而非鍵順序。不同不必然失敗,允許的轉換可記錄為規格;不可接受的損失則換格式或補中繼資料。
同時記錄欄選擇、巢狀模式、公式保護與編碼。應說明保留與改變了什麼,而非聲稱來自 JSON 所以相同。轉換只是交接一步,接收方仍需按預期理解。
交換前先約定空欄位的含義
接收方把 CSV 空欄當不修改,傳送方卻想刪除值,即使無亂碼或語法錯也會不一致。壓成表格前應約定空字串、null、未指定的區別。加狀態欄或選其他格式屬於交接設計,產生有效檔案與共享同一含義需要分別驗證。