CSV 转 JSON

全球通用工具

这是多数导入脚本的第一步,也是转换器真正证明自己的地方。CSV 文件是用文本写成的表格,但文本有规则:字段因为含有逗号而要加引号,引号内部的引号要双写,换行可能属于单元格而不是结束一行,使用小数逗号的地方用分号分隔,还有一些行的列数根本不对。每一处都是直觉式转换器会去猜的地方,而一次猜测就足以让上千行的导入悄悄多出一个空列。

宽松意义上的 CSV:字段由下面的分隔符隔开,带引号的字段、双写的引号、字段内部的换行,都按 RFC 4180 的规定读取。

使用小数逗号的地方,分号才是惯例——满是 1,5 这类值的 CSV 并不是逗号分隔的 CSV。“从文本中自动检测”会找出在每一行出现次数都相同的字符。

有表头时每一行变成一个对象;没有表头时每一行变成一个数组。

类型识别会把带前导零的值和超过十五位的值保留为文本,因为按数字处理都会出错。

留空则使用“data.json”。

边输入边更新。所有计算都在你的浏览器里完成,数据不会离开本机。

读取了 3 行

3 列

表格按 RFC 4180 读取,并以 JSON 写出,每一行对应一个对象。

行数
3
列数
3
长度不齐的行
0
大小
242 字节

JSON

[
  {
    "name": "Ada Lovelace",
    "role": "Editor",
    "since": "2024"
  },
  {
    "name": "Grace Hopper",
    "role": "Reviewer",
    "since": "2025"
  },
  {
    "name": "Alan Turing",
    "role": "Advisor",
    "since": "2025"
  }
]

可以复制,也可以下载成文件。每一行一个对象,列名就是键。

这些数字没有说明的事

  • 所有单元格都以文本输出,这是安全的默认值:表格里的电话号码、邮政编码或账号列,充满了看起来像数字却并不是数字的值。
  • 第一行被读作列名,分隔符设为逗号。带引号的字段、双写的引号以及字段内部的换行,都按格式规范读取。
表格在浏览器标签页里读取,JSON 也在这里写出:没有上传,也没有向任何地方发送内容。

这一页按 RFC 4180 读取表格,写出对象数组,一行一个对象,表头作为键;没有表头时写出数组的数组,这是真实需求,不是什么怪癖。它不会悄悄改写数据:被补齐的行、被截断的行、为避免被当成数字而保留为文本的单元格,都会被计数并报告,因为一个肯把自己做过的选择说出来的转换器,才敢用来处理客户名单。

关于这个工具

这一页和 JSON 转 CSV是同一对工具里的读取方向,职责也止于读取:拿到一张表和几个选项,交回 JSON。它不做文本重排,不做往返转换,也没有任何地方会把数据发出去——解析和写出都发生在标签页里,唯一离开这台电脑的文件,是你主动下载的那一个。

如果你要的是另一个方向,JSON 转 CSV 页面只差一次点击,会用同一套引号规则把对象数组写回表格,两种形式之间的往返因此不会丢失含义。如果你只是要从每一行里取出一个字段,JSON 格式化工具更轻。

它是怎么工作的

表格是怎么被读出来的,以及直觉式解析会在哪里出错

读取器把文本看成由分隔符隔开的字段,以及由换行分隔的记录,字段可以用双引号包起来。在引号内部,两个连续的双引号表示一个引号,分隔符只是一个普通字符,换行结束的是字段而不是记录——所以一条两行的备注仍然是一个单元格,而先按换行切分的读法会把整个文件撕成两半。引号也只能包住整个字段,不能只包住字段的一部分;字段末尾的空格属于值本身,规范并不会替你裁掉。

分隔符之所以是一个设置项,是因为它并不总是逗号:使用小数逗号的国家习惯用分号,Excel 复制出来的是制表符分隔的文本。自动检测会找出在前几行里出现次数都相同的那个字符,这是真实表格留下的特征,而不是巧合;结果面板会明确说明最终用了哪一个分隔符。

在数据到达之前还有两件事要处理。Excel 在“CSV UTF-8”导出文件开头写入的字节顺序标记会被移除,否则它会悄悄成为第一个列名的一部分,之后按列名查找的代码全都找不到它。另外,以等号、加号、减号或 @ 开头的单元格,可能被表格软件当作公式执行,也就是 CSV 注入,所以这类单元格会保持为纯文本,并单独计数上报。行尾的 CRLF 与 LF、以及未闭合的引号,也都在读取阶段处理:前者按规范接受,后者不会让整页解析悄悄吞掉后面的内容。

表头、长度不齐的行,以及那些不该变成数字的值

有表头行时,第一行成为对象的键,后面每一行成为一个对象;没有表头时,每一行成为数组,结果按位置读取。与表头不一致的行不会消失:短行用空单元格补齐,长行被截断,表格因此保持矩形,同时报告这些行的数量和前几个行号,因为丢掉字段的行,正是导入之前最需要知道的事。

默认情况下每个单元格都输出为文本,这是安全的设置:一列电话号码、邮政编码、账号或版本号里,充满了看起来像数字、其实不是数字的值,把它们转成数字只会悄悄破坏数据。类型识别可以打开,即便如此仍有两类值保持文本——带前导零的值,以及超过十五位的值,后者无法在浏览器的固定精度数字里保持精度。

这也是 CSV 与 JSON 之间最本质的差别:CSV 不携带类型信息,数字、日期和长得像它们的一段文字,一旦写进文件就无法再区分;转到 JSON 时只能靠推断,而推断就意味着可能出错。同理,空单元格无法区分“缺失”“空字符串”和 null,往返一次之后这个区别就永久消失。表头重复时,后面同名的列会覆盖前面的键,这也是需要提前检查的地方。

表格没有说出口的那些事,以及它们的代价

格式本身不携带类型,所以日期、版本号和邮政编码进来时是文本,出去时还是文本——除非打开类型识别;即便打开,带前导零的值和超过十五位的值也原样保留。空单元格是更尖锐的例子:识别关闭时它输出为空字符串,识别打开时输出为 null,而文件从来没有说过你想要哪一个,所以往返一次也补不回一个从未被写下的区别。

两列同名是另一个不声不响的陷阱:后面的列占住这个键,前面的值就此消失,所以不唯一的表头会在没有报错的情况下丢数据。表头单元格还会被截到 120 个字符,因为它要变成 JSON 的键;没有名字的列则得到一个像 column_3 这样的位置名。字段末尾的空格属于值本身——格式不会替你裁掉——所以看起来是数字的一列,可能因为末尾多一个空格而保持文本。

示例

示例使用页面自带的默认输入,只改设置;下面的结果与你在页面上看到的完全一致。

表格导出,读回成数据

在这里粘贴表格: name,role,since Ada Lovelace,Editor,2024 Grace Hopper,Reviewer,2025 Alan Turing,Advisor,2025 · 列分隔符: 逗号(,),最常见的选择 · 表头行: 是,第一行是列名 · 单元格取值: 识别数字和布尔值

读取了 3 行

3 列

表格按 RFC 4180 读取,并以 JSON 写出,每一行对应一个对象。

行数: 3 · 列数: 3 · 长度不齐的行: 0 · 大小: 236 字节

三行变成三个对象,因为打开了类型识别,年份列是整数而不是字符串。

没有表头的分号文件

在这里粘贴表格: Paris;48.86 London;51.51 Berlin;52.52 · 列分隔符: 分号(;),用于小数逗号为逗号的地区 · 表头行: 否,结果是数组的数组 · 单元格取值: 所有单元格都保持文本

读取了 3 行

2 列

表格按 RFC 4180 读取,并以 JSON 写出,每一行对应一个对象。

行数: 3 · 列数: 2 · 长度不齐的行: 0 · 大小: 107 字节

没有表头时结果是数组的数组,每一行保留自己的位置,而不是凭空造出键名。

常见问题

我的 CSV 会被上传到什么地方吗?

不会。文本在本标签页里由 JavaScript 解析并写出,结果面板只用页面上已有的内容构建,下载文件也是本地创建的 blob。导入的数据往往是客户记录或 API 响应,所以这里完全不接触服务器。

为什么我的数字都变成了文本?

因为这是安全的默认值。表格里一列电话号码、邮政编码、账号和版本号,充满了看起来像数字却不是数字的内容,识别它们会把“01234”变成 1234,也会把十六位的 ID 四舍五入。打开类型识别后,普通整数、小数和 true/false 会变成对应的 JSON 类型,而前导零和超过十五位的值仍然是文本。

我的文件用分号而不是逗号,能用吗?

能,而且自动选项通常能找到它:检测会挑出在每一行出现次数都相同的字符,这正是表格与散文的区别。拿不准时就显式指定分隔符——分号文件按逗号读取时,每一行都会挤成一个单元格,而结果面板始终会说明实际使用的分隔符。

单元格缺失或多余的行会怎样处理?

短行补齐,长行截断,让表格保持矩形,并带上行号报告,而不是悄悄修好。手工编辑过的文件、或者由版本不一致的系统导出的文件,经常出现这种行,如实说出来才是负责的做法。

为什么以 = 或 + 开头的单元格被保留为文本?

因为表格软件会执行它拿到的单元格。开头的 =、+、- 和 @ 都是公式的起点,所以这类单元格会保持为纯数据,并报告数量——这是针对 CSV 注入(也叫公式注入)的标准防御。

资料来源与统计口径

  • CSV 遵循 RFC 4180:字段用逗号分隔,记录以 CRLF 结尾,含逗号、引号或换行的字段会加引号。
  • 以 `=`、`+`、`-` 或 `@` 开头的单元格会保留为文本,表格软件无法把它当公式执行;以 0 开头的编号也不会被当成数字。
  • 表格只在你的浏览器里处理,不上传任何内容,结果在本地下载。

最近复核于 2026-10-07.

本页在您的浏览器本地运行,请保留原文件备份;不涉及财务建议。 阅读完整免责声明。