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。

大量轉換指的是單一有界表格
重要的區別在於大量資料與批次檔案之間的不同。本工具設計用於在單一貼上的文字表格內進行大規模處理。它最多可處理 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 表格
- 貼上 CSV。將單一以逗號分隔的文字表格貼入工具。確認其第一筆記錄含有非空、唯一且區分大小寫的標頭名稱,且每筆資料記錄的欄位數完全相同。
- 執行轉換並檢查摘要。執行轉換,然後驗證回報的資料列、欄、資料儲存格與 UTF-8 輸出大小。這些數字有助於確認表格為矩形結構且符合所有強制限制。
- 檢查 JSON 字串。檢查代表性數值,並掃描完整輸出以確認型別未發生變更。值 001 應保持為「001」,true 應保持為「true」,null 應保持為「null」,而空白儲存格應保持為空 JSON 字串。
- 複製或下載檔案。一旦物件對應、數值與大小摘要皆正確,即可複製完整的 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。