CSV 轉 JSON 工具
上傳 CSV 檔案或貼上資料,轉換為 JSON 格式
拖放 CSV 檔案到此處,或點選選擇檔案
什麼是 CSV 轉 JSON?
CSV 轉 JSON 是一個線上資料格式轉換工具,可以將 CSV(逗號分隔值)格式的資料轉換為 JSON(JavaScript 物件表示法)格式。
CSV 是一種常見的表格資料格式,廣泛用於電子試算表和資料庫匯出。JSON 是現代 Web 應用中最常用的資料交換格式,具有結構清晰、易於解析的優點。
使用本工具,您可以快速將 CSV 資料轉換為 JSON 陣列或物件,方便在程式設計和資料處理中使用。
使用方法
使用方式
- 在左側輸入面板貼上或輸入 CSV 資料
- 選擇適當的分隔符號(預設為逗號)
- 選擇是否將第一行作為欄位名稱
- 右側面板將自動產生 JSON 結果
CSV 解析注意事項
- 在信任 JSON 輸出前,請檢查分隔符號、引號處理與標題列設定。
- 大型 CSV 檔案可能包含空行、內嵌逗號或引號儲存格內的換行;轉換後請先預覽幾列。
使用場景
技術原理
CSV 解析遵循 IETF RFC 4180 文法:每筆記錄以 CRLF 結尾(部分方言接受 LF 或 CR),每筆記錄包含以分隔符號分隔的欄位(RFC 中為逗號,但 TSV、分號和管線符號是廣泛使用的變體),任何包含分隔符號、CR、LF 或雙引號的欄位必須以雙引號包裹,內部雙引號以加倍方式跳脫(Hello "world" 變為 "Hello ""world""")。本頁面的解析器是一個具有四種狀態的狀態機——field_start、in_unquoted、in_quoted、after_quote——以單次 O(n) 遍歷字元流處理輸入,因此一份 10 MB、10 萬列的 CSV 在一般筆電上能在遠低於一秒內完成,且不會為每列分配中間詞法單元陣列。 編碼需要明確處理:檔案開頭的 UTF-8 BOM(EF BB BF)在解析前會被移除,否則第一個標題名稱會以不可見的 U+FEFF 碼點開頭,導致下游的 JSON.parse 相等性檢查失敗。Windows 上的 Excel 匯出仍使用 CRLF 且通常帶 BOM 的 UTF-8,而 macOS Numbers 和大多數 Unix 工具預設使用不含 BOM 的 LF。歐洲的試算表常匯出分號分隔的檔案,因為逗號在許多地區設定中是小數點分隔符(49,90 EUR 而非 49.90),這就是為什麼分隔符號選擇器預設為逗號但將定位點、分號和管線符號作為一級選項。首行作為標題的開關將輸出形狀從物件陣列(標題鍵 -> 字串值)變為陣列的陣列,以匹配下游程式碼的兩種常見接收模式。 欄位值以字串形式輸出,而非推斷型別——CSV 沒有結構描述,因此 01234(補零的 ID)、1e10(看起來像電話號碼的字串,JSON.parse 會強制轉為數字)和 2024-13-45(格式錯誤的日期)都保持原樣。這是刻意的:下游的型別化 API 可以套用 zod、Joi 或手寫的強制轉換層並使用明確規則,但它無法還原轉換器已經丟棄的前導零。輸出透過 JSON.stringify(rows, null, 2) 產生並透過語法突顯器渲染;來源 CSV 使用 FileReader.readAsText() 讀取 Blob,永遠不會上傳到後端,因此人力資源匯出、財務帳本和客戶名單可以在不離開瀏覽器工作階段的情況下重新塑形。
- RFC 4180 文法:包含分隔符號 / CR / LF / " 的欄位必須加引號;內部引號以 "" 加倍跳脫。
- 單次 O(n) 狀態機,狀態為:field_start、in_unquoted、in_quoted、after_quote。
- UTF-8 BOM(EF BB BF / U+FEFF)在檔案開頭被移除,以保持標題鍵乾淨。
- 歐洲試算表常用 ; 作為分隔符,因為 , 在地區設定中是小數點標記。
- 首行作為標題切換輸出為 Array<Record<string,string>> 或 Array<Array<string>>。
- 所有欄位值保持字串;補零 ID 如 01234 能保留是因為沒有執行型別推斷。
- FileReader.readAsText() 在本地處理 Blob;不會上傳——對人力資源 / 財務 / 預備環境匯出安全。
範例
含表頭的基本 CSV → 物件 JSON 陣列
CSV 輸入:
name,age,city
Alice,28,New York
Bob,35,London
Carol,42,Tokyo
JSON 輸出:
[
{ "name": "Alice", "age": "28", "city": "New York" },
{ "name": "Bob", "age": "35", "city": "London" },
{ "name": "Carol", "age": "42", "city": "Tokyo" }
]含逗號的引號欄位
CSV 輸入:
id,product,description
1,"Notebook, A5","Hard cover, 200 pages"
2,Pen,"Black ink, 0.5mm"
JSON 輸出:
[
{ "id": "1", "product": "Notebook, A5", "description": "Hard cover, 200 pages" },
{ "id": "2", "product": "Pen", "description": "Black ink, 0.5mm" }
]無表頭的 TSV(Tab 分隔)
TSV 輸入(分隔符 = Tab,停用表頭):
101 Alice 98.5
102 Bob 87.0
103 Carol 92.3
JSON 輸出:
[
["101", "Alice", "98.5"],
["102", "Bob", "87.0"],
["103", "Carol", "92.3"]
]分號分隔(歐洲試算表匯出格式)
CSV 輸入(分隔符 = ;):
product;price_eur;stock
Keyboard;49,90;120
Mouse;19,90;345
JSON 輸出:
[
{ "product": "Keyboard", "price_eur": "49,90", "stock": "120" },
{ "product": "Mouse", "price_eur": "19,90", "stock": "345" }
]
備註:數字會保留為字串,請在後續程式中自行轉型。常見問題
支援哪些 CSV 變體?
標準 RFC 4180 CSV:以逗號分隔、用雙引號包欄位、雙引號跳脫採雙寫法。將分隔符改成 Tab(TSV)或分號的 CSV 也可以處理。各種換行符(LF/CRLF/CR)會自動處理。
標題列是怎麼處理的?
若啟用「第一列為標題」,解析器會把每個標題格當作該欄的 JSON 鍵,產出物件陣列。關閉標題後,解析器會產出陣列的陣列。空的標題格會給予一個數字佔位鍵。
型別是怎麼推斷的?
預設一律當作字串。打開「自動型別」會嘗試解析數字、布林(true/false)和 null。前置零的數字(00123、0042)會保留為字串,避免遺失前綴——很適合用在 ID 或郵遞區號。
如果欄位裡含有逗號或換行怎麼辦?
用雙引號包起來:"Smith, John" 或 "line one\nline two"。內嵌的雙引號要寫兩次:"He said ""hi"""。解析器都能處理;資料列斷掉的話,通常是引號不平衡所致。
轉換是在本地還是伺服器執行?
本地。解析在你的瀏覽器中由 JavaScript 完成,貼上的 CSV 不會離開頁面。檔案太大可能讓瀏覽器變慢;如果單次貼上超過數十 MB,建議先切分再處理。
會保留欄位順序嗎?
會——每列會轉成 JSON 物件,鍵的順序與 CSV 標題列順序一致;現代引擎的 JSON.stringify 會保留插入順序。如果下游工具讀 JSON 不保留插入順序,那是它的限制。
日期該怎麼處理?
日期會保留為字串。自動型別不會解析任意日期格式,因為沒有不會引起歧義的標準(1/2/2024 在美國是 1 月 2 日,在歐洲是 2 月 1 日)。如果下游需要原生 Date 物件,匯入前請先把日期轉成 ISO 8601(YYYY-MM-DD)。