開發與資料處理

CSV 轉 JSON 前,怎麼定義欄位與空值?

把訂單 CSV 交給 API 前,先用欄位契約決定標題、型別與空值規則,再以邊界資料檢查轉換結果,避免結構正確卻語意錯誤。

撰文: 3sec 編輯部 資料查證日期: 4 分鐘閱讀 1762 字

CSV 轉 JSON 前,先寫一份「欄位契約」:每個標題要叫什麼、應該是文字還是數字、空白代表空字串、null,或不送出該欄位。轉換完成只表示文字已排成 JSON,並不代表接收端會理解成你預期的訂單資料。

先用一筆訂單寫出欄位契約

最有效的起點,是拿一筆去識別化訂單,逐欄寫出輸入、輸出與驗收規則。不要直接把整批資料丟進轉換流程,再從錯誤訊息猜 API 想要什麼。

例如匯出檔有 order_no,item_count,paid,buyer_note,cancel_reason。order_no 的 TW000731 是不可計算的文字;item_count 的 2 才可能要變成數字;paid 要依介面規格轉成布林值;未留言的 buyer_note 可能保留 "";未取消的 cancel_reason 則可能要求 null 或完全省略。這些選擇沒有通用答案,必須對照 API 的正式欄位說明。

標題也要先整理。名稱不能重複,前後空白不能假裝不存在,大小寫與底線要和介面一致。RFC 8259把字串、數字、布林值與 null 視為不同 JSON 型別,也提醒物件成員名稱應保持唯一;若兩欄都叫 price,不同接收程式可能留下不同結果。

用邊界樣本測出 CSV 的真正形狀

先做一份五到八列的小樣本,刻意包含正常列、空值、逗號、雙引號、換行與最後一欄缺值。這份樣本比只看第一列更容易找出欄位位移。

RFC 4180 的常見 CSV 格式建議標題與各筆記錄維持相同欄數,逗號、換行或雙引號出現在欄位內容時要用雙引號包住,內容中的雙引號則以兩個雙引號表示。不過 CSV 實作仍有差異,所以還要確認來源系統使用逗號、Tab 還是其他分隔符,並保留原始匯出檔作為回查依據。

以客服備註為例,希望週五到貨,請先電話聯絡 內含逗號,整個欄位就要正確加上引號。若備註本身寫了 客戶說「改寄公司」,匯出系統可能用成對的雙引號跳脫。不要手動刪掉標點來讓列看起來整齊;那會改變原始內容,也可能掩蓋真正的解析問題。

樣本不得含真實姓名、電話、地址或存取憑證。需要除錯時,用合成訂單保留相同欄位形狀即可。

轉換器會做什麼,又不會替你決定什麼

打開 CSV ⇄ JSON 互轉工具(csv-json),把樣本文字貼到 CSV 輸入區,選擇單一分隔符,並依第一列是否為標題決定要不要勾選表頭。執行 CSV → JSON 後,工具會把每一筆資料排成陣列;有表頭時,各欄會用第一列文字當作物件鍵。

目前工具會保留 CSV 儲存格的文字型態。2、false 與空白欄位分別會先得到 "2"、"false" 與 "",不會自動改成數字、布林值或 null。某列少欄時,缺少的位置會補空字串;某列比標題多出的值不會自動創造新鍵。這正是轉換後仍要核對欄數與型別的原因。

這個頁面只處理貼上的 CSV/JSON 文字,沒有檔案選擇功能,也不會開啟或修改電腦裡的工作簿。相關的 CSV / Excel 線上預覽工具可以在瀏覽器開啟 CSV、TSV、XLSX 或 XLS,切換工作表、搜尋資料列,並把目前工作表另匯出成 CSV;它是預覽工具,不能在頁面裡編輯工作簿再存回原檔。

把型別與空值轉換放在可追蹤的步驟

先保留工具產生的第一版 JSON,再依欄位契約做明確轉換。每條規則應只處理指定欄位,不能把所有看起來像數字的文字一起改掉。

  • 識別碼、郵遞區號與含前導零的代碼通常維持字串。
  • 數量只有在接收端要求數字,而且原值通過格式檢查後才轉型。
  • true 與 false 要先排除其他狀態文字,不能只用「非空白就是真」的做法。
  • 空字串、null 與缺少鍵值分開處理,並記錄使用哪一條 API 規則。

如果資料由程式送出,這些轉換最好寫在版本可追蹤的資料處理步驟,並為每個欄位準備成功與失敗樣本。若只能人工整理,也要留存欄位對照、處理日期與一小份已核對輸出,避免下一次匯入又重新猜規則。

送出前用列數、鍵名與代表資料驗收

驗收時要從原始列一路對到最終物件。先比較輸入資料筆數與 JSON 陣列長度,再檢查每個物件的鍵集合,最後抽查第一筆、含引號的備註、空值列與最後一筆。

可以把結果貼到 JSON 格式化工具檢查語法、層級與錯誤位置。它能證明文字可被 JSON 解析,不能證明 API 架構、必填欄位、金額精度或訂單狀態正確。

正式送整批資料前,先在測試環境提交少量合成訂單。把接收端回傳的識別碼、欄位錯誤與實際儲存結果,逐一對回原始樣本。若測試失敗,從保留的原始匯出與欄位契約重做,不要在多份來路不明的暫存檔之間補值。

常見問題

CSV 裡的 000731 為什麼沒有自動變成數字?

目前工具會把 CSV 欄位保留成文字。這能避免訂單號、郵遞區號等代碼遺失前導零;只有欄位契約明確要求數字時,才在後續步驟轉型。

空白欄位一定要改成 null 嗎?

不一定。空字串、null 與省略欄位可能代表三種不同狀態,應依接收 API 的正式說明處理,不能用一次全域取代決定。

兩個相同標題可以直接轉換嗎?

不建議。JSON 物件名稱應保持唯一,而目前轉換結果可能只留下重複標題中後出現的值。先把標題改成可辨識且能對應 API 的唯一名稱。

CSV / Excel 預覽工具可以幫我直接改 XLSX 嗎?

不能。它只能預覽、搜尋與把目前工作表匯出成 CSV,不會在原工作簿中編輯儲存格,也不會覆寫原檔。

JSON 格式正確就可以直接送正式 API 嗎?

不能。語法正確不代表欄位名稱、型別、空值政策與業務狀態都正確;仍要用合成樣本、測試環境與接收端結果完成驗收。

參考資料