CSV 转 JSON
把 CSV 和 TSV 数据转换成 JSON,正确处理带引号的字段、内嵌逗号和换行符。可选的类型推断能把数字和布尔值转换成真正的 JSON 值。
- 文件永不离开你的设备
- 免费,无需注册
- 无水印
- 加载后可离线使用
如何CSV 转 JSON
- 1
粘贴你的 CSV
直接从电子表格粘贴,或者手动输入。
- 2
设置选项
选择分隔符,决定第一行是否是表头,以及是否推断类型。
- 3
复制 JSON
复制结果,或下载为 .json 文件。
为什么按逗号切分会破坏真实世界的 CSV
CSV 看起来解析起来很简单——按逗号切分每一行,把第一行当作表头——直到实际数据里某个值本身就包含一个逗号,而这在真实的电子表格导出中屡见不鲜:一个像 "123 Main St, Apt 4" 这样的地址,一个像 "Smith, Jones & Co" 这样的公司名,或者一段包含列表的产品描述。CSV 规范,也就是 RFC 4180,通过允许一个字段被双引号包裹来处理这种情况,在引号内部,逗号、换行符,甚至字面意义上的引号字符(通过重复来转义)都只是数据,而不是结构。一个天真地对每个逗号都做切分、完全忽略引号的解析器,恰恰会破坏这些行——把 "Smith, Jones & Co" 切分成两个独立的列——而且它通常会悄无声息地这样做,没有任何错误提示能标记出问题,这正是这个 bug 危险、而不只是烦人的原因所在。
正确的、能感知引号的解析方式,会追踪读取过程当前是否处于一个带引号的字段内部,并在遇到闭合引号之前忽略分隔符和换行符,这是正确还原那些本来就合法包含了容易被误认为结构字符的字段的唯一方式。
类型推断能做对什么,又刻意在哪里保持克制
一份原始 CSV 文件里的每一个值都是文本,因为 CSV 本身没有数字、布尔值或 null 的原生概念——一个包含 `42` 的单元格和一个包含 `hello` 的单元格,存储方式完全一样,都是字符。类型推断就是猜测哪些字符串"本来"是想表示数字、真/假值或 null,并相应地转换它们,让最终的 JSON 拥有真正带类型的值,而不是把所有内容都当作字符串裹在引号里。
不过这种猜测必须保持保守,因为很多看起来像数字的值根本不该被当作数字处理。一个带前导零的值——`007`、`042`——通常表示的是一个标识符或者一个位数固定的代码,这里的前导零本身就有意义,一旦转换成数字就会被悄悄抹掉,因为 `7` 和 `007` 是同一个数字,却是截然不同的标识符。一个像 `+44 20 7946 0958` 这样的电话号码看起来部分像数字,但并不是用来做算术的数据。超出 JavaScript 安全整数范围的值,一旦转换成数字就会丢失精度。这个工具刻意把所有这些都保留为字符串,正是因为在这里猜错了,就意味着以一种直到很久以后才容易被发现的方式,悄悄破坏了数据。
为什么重复和空白的列表头需要特殊处理
一个 JSON 对象不能有两个同名的键——后遇到的那个会直接覆盖前一个,悄无声息地丢弃掉整整一列的数据,不会在任何地方报错。电子表格导出文件产出重复表头的概率比想象中要高得多:一份报表里有两个统计范围不同的"合计"列,或者一份从两个来源合并的导出文件,恰好都用了"名称"这个表头。检测到重复并把第二次出现的表头重命名为 `name_2`,能保留每一列的数据,而不是悄悄丢失行对象里恰好先出现的那一个。空白表头出于同样的原因得到同样的处理,因为 JSON 没有办法把一个纯粹是空字符串的键,表示成一个有意义、可寻址的字段。
常见问题
能处理带引号字段内部的逗号吗?
可以。解析器正确遵循 RFC 4180 规范:带引号的字段内部可以包含逗号、换行符和转义引号(写作 "")。按逗号直接切分的工具,恰恰会破坏这类数据,而且通常不会有任何报错。
类型推断会怎么处理前导零?
会原样保留。`007`、`+44` 以及超出 JavaScript 安全整数范围的值都会保持字符串形式,因为它们几乎总是 ID、电话号码或邮编——转换成数字会悄悄破坏数据。只有明确无歧义的数字、布尔值和 null 才会被转换。
重复的列名会怎样处理?
会被重命名成唯一的名称——第二个 `name` 列会变成 `name_2`——因为 JSON 对象里两个相同的键会互相悄悄覆盖。空白表头会依次变成 `column_1`、`column_2` 等等。
能直接转换 Excel 文件吗?
目前还不行——请先把它另存或导出成 CSV(在 Excel 和 Google Sheets 里都是"文件 → 另存为 → CSV")。注意欧洲地区安装的 Excel 通常使用分号作为分隔符;如果你的列出现合并错乱,切换一下分隔符选项。
我的数据会被上传吗?
不会。解析完全在你的浏览器里进行,这一点很重要,因为 CSV 导出文件通常正好携带着客户、财务或员工数据,这些都不该被粘贴进别人的服务器。