ToolAct工具行动

CSV 转 JSON 工具

上传 CSV 文件或粘贴数据,快速转换为 JSON 格式

拖放 CSV 文件到此处,或点击选择文件

什么是 CSV 转 JSON?

CSV 转 JSON 是将逗号分隔值格式的表格数据转换为 JavaScript 对象表示法格式的工具。CSV 常用于电子表格导出、数据库迁移、数据交换等场景,特点是简单直观、兼容性强。JSON 则是现代 Web API 的标准数据格式,支持嵌套结构,易于程序处理。本工具帮助你在两种格式间快速转换,无需编写解析代码。 用于生产数据或真实代码库时,仍应结合解析器、测试结果和项目规范再次确认。

使用方法

使用方法

  1. 在左侧输入面板粘贴或输入 CSV 数据
  2. 选择合适的分隔符(默认为逗号)
  3. 选择是否将第一行作为字段名
  4. 右侧面板将自动生成 JSON 结果

CSV 解析注意事项

  • 在信任 JSON 输出之前,请检查分隔符、引号处理和首行设置。
  • 大型 CSV 文件可能包含空行、嵌入的逗号或引号单元格内的换行符;转换后请预览几行数据。

使用场景

将上传的 CSV 或 TSV 文件转换为 JSON 数组拖放或选择 .csv、.tsv 或 .txt 文件,选择逗号、Tab、分号或竖线分隔符,决定首行是作为对象键还是保持为数组输出。文件通过 FileReader 在浏览器中读取,使用流式分词器在本地解析,永远不会被上传,客户或内部导出数据不会离开设备。
使用前预览行数和字段数利用显示的文件名、行数、字段数和高亮的 JSON 输出,在复制到 mock 或脚本之前捕获分隔符错误、缺失表头或空行。这是一个受控的中间步骤:将输出粘贴到真实目标并验证接收系统的解析方式是否一致。
在浏览器内处理简单带引号的 CSV解析器支持带引号字段、转义的双引号和四种常用分隔符,适合小型导出和测试数据。文件完全在浏览器内存中处理,即使是敏感的人力资源、财务或预发布快照也能在不通过网络发送数据的情况下重新格式化。
向类型化 API 发送 JSON 时保留类型信息转换后扫描输出,将应为数字、布尔值、日期或 null 而非字符串的字段在发送到 REST 或 GraphQL 端点之前进行后处理。CSV 没有原生类型,快速目视扫描前几行通常足以发现带引号的 ID 和零填充编码。
推送到 mock 或测试数据前发现格式错误的行利用行数、字段数和解析错误标记不符合预期列数的行,修复源 CSV 而非让错误行混入 mock JSON。预览面板会在第一个不一致行处停止,方便在重新运行前修正分隔符或补充缺失的引号。

技术原理

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 万行的 10 MB CSV 文件在普通笔记本电脑上不到一秒即可完成,且无需为每行分配中间词法单元数组。 编码需要显式处理:文件开头的 UTF-8 BOM(EF BB BF)在解析前会被剥离,否则第一个表头字段名会以不可见的 U+FEFF 码点开头,导致下游 JSON.parse 的相等性检查失败。Windows 上的 Excel 导出仍然是 CRLF 换行且通常带 UTF-8 BOM,而 macOS Numbers 和大多数 Unix 工具默认为 LF 无 BOM。欧洲电子表格通常导出分号分隔的文件,因为在许多语言环境中逗号是小数点分隔符(49,90 EUR 而非 49.90),这就是为什么分隔符选择器默认为逗号但将制表符、分号和竖线作为一等选项。首行作为表头的切换会改变输出结构:从对象数组(表头键 -> 字符串值)变为二维数组,匹配下游代码的两种常见数据摄入模式。 字段值以字符串形式输出,而非推断类型 — CSV 没有 schema,因此 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(制表符分隔)

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:以逗号作为分隔符、用双引号引用字段、用两个连续的双引号转义字段中的双引号。改一下分隔符就可以处理 TSV(制表符分隔)和分号分隔的 CSV。LF、CRLF、CR 等不同的行尾会被自动识别。

表头是怎么处理的?

如果启用「首行为表头」,解析器会用每个表头单元格作为对应列的 JSON key,输出一个对象数组。关闭表头时则输出一个二维数组。空的表头单元格会被赋予一个数字占位 key。

数据类型是怎么推断的?

默认所有值都按字符串处理。开启「自动类型」后会尝试解析为 number、boolean(true/false)和 null。带前导零的数字(00123、0042)会保留为字符串以避免丢失前缀——这适合 ID 和邮政编码这类场景。

如果字段里包含逗号或换行怎么办?

用双引号把整个字段包起来:"Smith, John" 或 "line one\nline two"。字段内部的双引号写成两个连续的双引号:"He said ""hi"""。解析器都能正确处理这些情况;如果某一行解析出错,原因通常是引号不成对。

转换是在本地还是在服务器上完成的?

在本地完成。解析通过 JavaScript 在你的浏览器中进行,粘贴的 CSV 不会离开页面。文件较大时浏览器可能会变慢;如果一次粘贴超过几十 MB,建议先拆分再处理。

会保留列的顺序吗?

会——每行会变成一个 JSON 对象,其 key 顺序与 CSV 表头一致;现代引擎中的 JSON.stringify 会保留插入顺序。如果下游工具读取 JSON 时不保留插入顺序,那是它的局限。

日期怎么处理?

日期会原样保留为字符串。自动类型推断不会去识别任意日期格式,因为没有一个无歧义的标准(1/2/2024 在美国是 1 月 2 日,在欧洲则是 2 月 1 日)。如果下游需要原生 Date 对象,请先把日期转换成 ISO 8601 格式(YYYY-MM-DD)再导入。