CSV 轉 JSON 大量轉換,是指將單一以逗號分隔的 CSV 表格(最多包含 5,000,000 個 UTF-16 程式碼單位與 10,000 筆資料列)進行受控轉換,產生一個經過美化輸出的 JSON 陣列,同時將每個儲存格保留為 JSON 字串。 CSV 轉 JSON 工具會在目前的瀏器分頁中執行此工作:貼上單一以逗號分隔的表格、進行轉換、檢視回報的計數、檢查 JSON,然後複製或下載結果。其第一筆 CSV 記錄會成為精確的 JSON 標頭,而每筆資料記錄則會成為一個物件。標頭順序決定屬性順序,而每個儲存格都會成為字串。因此轉換器不會推測 001 是數字、true 是布林值,或 null 代表 JSON null 值。引號內的逗號、雙引號以及嵌入引號欄位內的換行字元,會依據支援的 CSV 語法予以保留。成功轉換後,資料列、欄、儲存格與 UTF-8 輸出大小的摘要可提供快速的完整性檢查。這裡的「大量」指的是在單一有界表格中可處理的記錄數,而非多個 CSV 檔案的佇列。若要轉換多個獨立檔案,請為每個表格分別執行轉換。完整的解析、驗證、序列化、測量與匯出流程都在本機進行;不會上傳任何 CSV 或 JSON。

csv to json bulk
CSV 轉 JSON 大量:驗證單一大型表格

大量轉換指的是單一有界表格

重要的區別在於大量資料與批次檔案之間的不同。本工具設計用於在單一貼上的文字表格內進行大規模處理。它最多可處理 10,000 筆資料記錄、200 個欄位與 200,000 個資料儲存格,但這些上限彼此相互影響,而非各自獨立。

欄位較多但列數較少的寬表格,可能在達到 10,000 列之前就先觸及 200,000 儲存格上限。反之,欄位較窄但記錄較多且較短的表格,則會受到列數與輸出大小預算的限制。含有大量 JSON 跳脫字元的表格,可能比其原始輸入大小所顯示的更快耗盡 UTF-8 輸出上限。

這些都是強制執行的限制,而非靜默的上限。剛好等於邊界值會被接受,但只要超出邊界一個程式碼單位、一列、一欄、一個儲存格或一個 UTF-8 位元組,轉換就會明確失敗。成功的轉換會產生完整的 JSON 陣列;失敗時不會回傳部分陣列,因此下游程式碼無需猜測是否有部分記錄被省略。

為嚴格解析準備表格

在轉換前先準備輸入內容,讓第一筆記錄能夠作為精確的標頭。在處理完選用的前置 UTF-8 BOM 後,每個標頭都必須保持非空。標頭名稱必須唯一,且比對方式為完全相符且區分大小寫。空白字元是標頭的一部分,因此 id、Id 以及包含前置空白的名稱都是不同的鍵。轉換器不會自動修剪這些空白。

  • 僅使用逗號作為欄位分隔符。Tab、分號與直立線仍視為一般欄位字元。
  • 每筆資料記錄的欄位數必須相同。短列、長列,以及看似會產生額外記錄的結尾記錄會依解析器規則處理,但每筆實際的資料記錄都必須符合標頭的欄位數。
  • 使用未加引號的欄位,或以雙引號括住欄位。引號內的欄位可包含逗號、CRLF、LF、CR 以及雙倍的雙引號。引號欄位內連續兩個引號會解碼為一個字面上的引號。
  • 引號語法必須精確無誤。未加引號的引號、未閉合的引號,或在閉合引號之後接續的內容,會被拒絕而非自動修復或捨棄。

在引號欄位之外,CRLF 是正式的記錄結尾。獨立的 LF 與獨立的 CR 會作為互通性延伸而被接受。結尾的記錄結尾符號為選用,並不會產生額外的空記錄,而連續第二個記錄結尾符號則代表一筆空白記錄。引號內的換行字元會以其原始的 CRLF、LF 或 CR 形式保留為欄位資料。

解析器不會自動偵測其他分隔符、略過註解、修剪欄位、捨棄空白記錄、合併寬度不一致的列,或推測結構描述。輸入開頭的一個 U+FEFF 會作為常見的 UTF-8 BOM 被消耗掉,包括第一個欄位已加引號的情況,且原始輸入預算會在該移除動作之前先進行檢查。位於其他位置的 U+FEFF 則會保留為資料。若檔案僅包含 BOM,則在正規化後會變為空白,並回報「需要輸入」的錯誤。

轉換並驗證單一 CSV 表格

  1. 貼上 CSV。將單一以逗號分隔的文字表格貼入工具。確認其第一筆記錄含有非空、唯一且區分大小寫的標頭名稱,且每筆資料記錄的欄位數完全相同。
  2. 執行轉換並檢查摘要。執行轉換,然後驗證回報的資料列、欄、資料儲存格與 UTF-8 輸出大小。這些數字有助於確認表格為矩形結構且符合所有強制限制。
  3. 檢查 JSON 字串。檢查代表性數值,並掃描完整輸出以確認型別未發生變更。值 001 應保持為「001」,true 應保持為「true」,null 應保持為「null」,而空白儲存格應保持為空 JSON 字串。
  4. 複製或下載檔案。一旦物件對應、數值與大小摘要皆正確,即可複製完整的 JSON 或將其下載為 converted.json。編輯來源輸入會清除先前的輸出、計數、錯誤與複製狀態,以避免重複使用過期的 JSON。

檢查物件對應與字串值

轉換會將表格結構直接對應至 JSON 結構。匯出前檢視此對應關係相當重要,因為此工具會保留儲存格文字,而非像資料庫或試算表那樣加以解讀。

CSV 輸入 JSON 結果
完整表格 單一美化輸出的 JSON 陣列
第一筆記錄 精確的物件鍵
標頭順序 屬性順序
每筆資料記錄 一個物件
每個儲存格 一個 JSON 字串
空白儲存格 空字串
引號內的逗號 同一字串內的逗號
雙倍引號 一個字面上的引號
嵌入的換行字元 字串內的換行文字

在內部,每筆記錄會在序列化之前先建構為 null-prototype 物件。因此名稱如 __proto__、constructor、prototype 與 toString 都是普通的自有字串鍵,而非繼承自物件的屬性。接著 JSON.stringify 會使用兩個空格的縮排,跳脫屬性名稱、引號、反斜線、控制字元與嵌入的換行字元。其結果是有效的 JSON 資料,而非可執行的程式碼。接收端的應用程式仍須根據自身需求對 JSON 進行解析與驗證。

遵守強制轉換限制

在試大型轉換之前,請先檢查每一項相關限制。表格必須符合以下由產品定義的邊界:

量測項目 上限 量測細節
原始輸入 5,000,000 個 UTF-16 程式碼單位 在消耗前置 U+FEFF 之前進行檢查
資料列 10,000 標頭不計入資料列
欄位 200 每筆資料記錄必須符合標頭的欄位數
資料儲存格 200,000 寬表格可能會在達到列數上限前先觸及此限制
產生的 JSON 10,000,000 個 UTF-8 位元組 使用 TextEncoder 進行量測,而非 JavaScript 字串長度

多位元組 Unicode 會依其 UTF-8 位元組數,而非 JavaScript 字串長度,影響產生的 JSON 大小。這就是為何某個表格可能符合原始程式碼單位預算,卻在輸出量測階段失敗。剛好等於列、欄、儲存格與位元組邊界值會被接受。超出邊界一個單位會明確失敗,且同樣適用完整轉換的規則。若列寬無效或超出輸出大小邊界,則不會留下部分 JSON 或過期的下載檔案。

檢視輸出時保留來源脈絡

保留字串的轉換不應與逐位元組還原原始檔案混為一談。前置的第一個 BOM 會在標頭解析前被消耗,而位於其他位置的 BOM 則會保留為資料。在引號外,記錄結尾是結構分隔符,而非序列化的儲存格內容。在引號內,支援的結尾字元會以其原始形式保留為字串的一部分。此工具亦不會對 Unicode 進行正規化。

轉換器不會執行試算表公式、抓取連結值、驗證商業意義、推測結構描述、扁平化結構、去重記錄,或重新命名鍵。在匯入 JSON 之前,請檢視標頭名稱、計數、引號用法與代表性的字串值。若原始 CSV 的引號或換行呈現方式在檢視或除錯時可能很重要,請保留來源 CSV。

在瀏覽器本機執行大量轉換

所有解析、物件建構、UTF-8 量測、複製與 Blob 建立作業,都在目前的瀏覽器分機本機進行。此工具不會抓取連結值,且貼上的 CSV 與產生的 JSON 在轉換過程中皆不會被上傳。

狀態清理已內建於工作流程中。編輯 CSV 會撤銷舊的 JSON ObjectURL,並清除先前的輸出、錯誤、摘要、複製狀態與計時器。轉換失敗同樣會撤銷下載狀態,且不會留下過期的檔案。這些控制機制可避免將先前成功的結果誤認為較新的編輯輸入結果。

若要進行可靠的批次轉換,請先確認第一筆記錄的標頭規則、檢查每筆記錄的欄位數是否一致、檢視回報的限制、確認所有儲存格仍為字串,然後再複製或下載 converted.json。如此可讓結果保持可預測,並將最終的商業驗證工作留給接收端的應用程式。

延伸閱讀:駝峰式轉蛇式批次:一次貼上,六種樣式。

延伸閱讀:取得 Excel 欄位名稱並於本機匯出為 CSV。