JSON 转 CSV

全球通用工具

有两种转换看起来微不足道,实际上并不是:值里带逗号、引号里再套引号、备注里有换行、来自小数点为逗号的国家用分号分隔的文件、字段数量不对的行、以等号开头的单元格——上述每一种都能让只会用逗号拼接的转换器出错。CSV 有一份简短的规范,正好回答了这些问题,这一页按规范来做。

从数据得到表格,或从表格得到数据:下面的选项随方向变化,只显示这个方向真正用得上的那些。

JSON 转 CSV 需要对象数组(或数组的数组)。CSV 转 JSON 需要带表头的文本;如果没有表头,在下面说明即可。

在使用小数逗号的地方,分号才是惯例 —— 满是 1,5 这类值的 CSV,不该再用逗号分隔。

写出时不带表头会丢掉列名;读取时没有表头则返回数组而不是对象。

两种方式都不会丢内容:结构保留为列名,或者作为 JSON 放在一个单元格里。

表格软件会把这四个字符当作公式的开头:这就是众所周知的 CSV 注入问题,撇号是标准防御手段。

RFC 4180 要求 CRLF;数据库导入和 Unix 管道通常偏好 LF。两种情况下单元格里的字符都不动,行还是那些行。

留空则使用「table.csv」或「table.json」。

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

一张 3 行的表格

3 列

以逗号为分隔符写成 CSV,可直接交给表格软件、数据库导入或脚本使用。

行数
3
列数
3
单元格数
9
大小
97 字节

CSV

name,role,since
Ada Lovelace,Editor,2024
Grace Hopper,Reviewer,2025
Alan Turing,Advisor,2025

可以复制,也可以下载成文件。每个值都完全等于 JSON 里的内容:没有四舍五入、没有截短、没有重排。

这些数字没有说明的事

  • 嵌套对象变成了带点的列名(address.city)。数组保持为单元格里的 JSON 文本,因为表格要容纳列表,要么丢掉它,要么凭空造行。
  • 分隔符是逗号,带表头行,换行是 CRLF。每个含分隔符、引号或换行的单元格都会加引号,内部的引号双写:这就是 RFC 4180 的全部。
文档在浏览器标签页里解析,表格也在这里写出。客户数据的 CSV 导出或一段 API 响应,正是最不该经过别人服务器的东西,所以它根本没有离开本机。

两个方向都在这里:对象数组进,表格出;表格进,对象数组出。它不会悄悄替你做决定——被补齐的列、被调整过的行、为防公式而被处理的单元格,都会逐项报告,因为默默改写数据的转换器比直接拒绝的更糟。

关于这个工具

在数据管道要跨过的各种格式里,JSON 和 CSV 恰好站在两端:一个可以嵌套,一个是扁平的。这一页在两者之间转换——把 API 响应摊平成行与列,把选定的嵌套部分整体保留,再把表格导出读回成对象——并且在下载之前先把表格展示出来。

转换是确定性的,规则就印在旁边:嵌套对象变成带点的键,数组变成一个合并的单元格或若干编号列,含逗号或引号的值按 CSV 的规则加引号。没有账号,也不上传;解析和写出都在标签页里完成。

CSV 不携带类型信息,所以数字、日期和看起来像它们的一段文字,一旦写进文件就无法区分;页面选择把它们保持为字符串,而不是替你猜测。表头顺序默认跟随第一个对象,除非你另行设置。把文件交给任何依赖模式的工具之前,先看一眼预览。

它是怎么工作的

CSV 到底是什么,以及数据一定会遇到的四件事

CSV 文件是用文本写成的表格,规则很短:字段由分隔符隔开,记录由换行分隔,字段可以用双引号包起来。在引号内部,两个连续引号表示一个引号,分隔符只是普通字符,换行属于字段本身,而不是记录结束。最后这条规则解释了为什么一条两行的备注是一个单元格而不是两行,也解释了为什么先按换行切分会把文件弄坏。

分隔符并不总是逗号。欧洲不少地区使用分号,因为那里的小数分隔符是逗号,`1,5;2,5` 没有歧义,而 `1,5,2,5` 有。Excel 会把制表符分隔的文本粘贴到单元格里。所以这里的分隔符是一个设置项,并提供自动检测:找出在每一行出现次数都相同的那个字符,而这正是“表格之所以是表格”的信号。

第四件事是看不见的:字节顺序标记。Excel 在“CSV UTF-8”文件开头写入 BOM,它到达时是一个没有宽度的字符,会混进第一个列名,让这个列名再也搜不到。页面在读取时把它去掉,一行代码就能省掉大量困惑。

嵌套对象、长度不齐的行,以及必须做出的选择

JSON 文档可以嵌套,表格不能。所以嵌套对象要么变成带点的列名(`address.city`),要么以 JSON 文本的形式待在一个单元格里;这个选项之所以存在,是因为两种答案在不同场景下都对——一种适合导入数据库,另一种适合保持文档完整。两种方式都不会丢内容。数组在两种模式下都保持为单元格里的 JSON 文本:表格里的列表要么被拆成额外的行,那等于凭空造行;要么被截断,那等于丢数据。

与表头不一致的行,是简单转换器容易意外出错的另一处。这里短行用空单元格补齐,长行被截断,表格因此保持矩形;两种情况都会被计数并报告,因为丢掉字段的行,正是导入上千条记录之前必须知道的事。

缺失的键变成空单元格,`null` 也变成空单元格。这一点值得记住:文档一旦变成 CSV,就无法区分“缺失”“空”和“null”,因为格式本身没有办法写出这种差别。

公式问题:这是安全问题,不是小毛病

以 `=`、`+`、`-` 或 `@` 开头的单元格,会被 Excel、LibreOffice、Numbers 和 Google Sheets 当作公式。这件事有名有姓,叫 CSV 注入,也叫公式注入:一份 CSV 可以让别人的表格在打开的瞬间执行计算——跟随一个链接,在较旧的配置里执行一条 shell 命令,至少也是一整格错误值。而这类值往往来自用户输入的导出,正是攻击者会放置它的地方。

标准防御就是页面默认采取的做法:给这类单元格加上撇号前缀,表格软件会把它理解为“后面全是文本”。单元格里可见的内容没有变化,想要原始值可以用查找替换去掉撇号,这个选项也可以关闭——但默认开启,因为承担风险的是打开文件的人。

示例

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

API 响应变成表格

转换方向: JSON 转 CSV,从数据得到表格

一张 3 行的表格

3 列

以逗号为分隔符写成 CSV,可直接交给表格软件、数据库导入或脚本使用。

行数: 3 · 列数: 3 · 单元格数: 9 · 大小: 97 字节

三个对象进,三行出,键作为表头。每个对象都持有相同的三个键,所以既没有补齐也没有截断——这是整齐的情况,而不是唯一的情况。

同样数据,嵌套部分整体保留

转换方向: JSON 转 CSV,从数据得到表格 · 嵌套对象: 每个对象作为 JSON 文本放进单元格

一张 3 行的表格

3 列

以逗号为分隔符写成 CSV,可直接交给表格软件、数据库导入或脚本使用。

行数: 3 · 列数: 3 · 单元格数: 9 · 大小: 97 字节

关闭摊平后,嵌套对象以 JSON 文本的形式待在单元格里,引号按 CSV 要求双写。如果文档必须在往返后保持不变,就该用这个版本。

表格导出,再读回数据

转换方向: CSV 转 JSON,从表格得到数据 · 单元格取值: 识别数字和布尔值

读取了 2 行

3 列

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

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

反向读取会识别数字和布尔值,但在按数字解读会出错的地方例外:带前导零的值(电话号码、邮政编码)以及超过十五位的数字都保持文本,因为它们本来就是文本。

常见问题

我的数据会被上传吗?

不会。文本在标签页里由 JavaScript 解析和写出,下载文件是本地创建的 blob。页面背后完全没有请求,这一点在这里比在多数工具上更重要:JSON 转 CSV 往往是在导出客户记录、带令牌的 API 响应,或者某人的联系人列表。

为什么我的 CSV 在表格软件里全挤在一列?

因为文件使用的分隔符与表格软件猜的不一样。用分号写出的文件,在按小数逗号配置的表格软件里能正常打开,在别处则会挤成一列;制表符分隔的文件则相反。把这里的分隔符设成一致,或者使用自动检测,并在导入上千行之前先看一眼输出的第一行。

嵌套对象和数组会怎样处理?

摊平开启时,对象变成带点的列名(`address.city`);关闭时,对象以 JSON 文本的形式放在一个单元格里——两种方式都不会丢内容。数组始终以 JSON 文本的形式留在单个单元格中,因为表格要容纳列表,要么凭空多造行,要么丢掉一部分,两者都比一个“胖”单元格更糟。

为什么有些输出被双引号包起来?

因为值里含有分隔符、引号或换行,规范要求这类字段加引号,读者才知道里面的逗号是文本而不是分隔符。带引号字段内部的引号要双写,这就是“字段里含引号”的写法。RFC 4180 讲的就是这些,所有表格软件都认。

为什么我的数字前面多了个撇号?

因为它以 `=`、`+`、`-` 或 `@` 开头,表格软件会把它当作公式。这就是 CSV 注入问题:像 `=HYPERLINK(...)` 这样的单元格,会在文件被打开时由表格软件执行,而这类值通常来自网站上的用户输入。撇号是标准防御手段,可以在设置里关掉——选项就在那里,默认开启,因为承担风险的是打开文件的人。

为什么转换回来的 JSON 里全是字符串?

因为这是默认值,也是安全的读法:表格里的一列电话号码、邮政编码、账号和版本号,充满了看起来像数字却并不是数字的值。开启类型识别后,普通整数、小数和 `true`/`false` 会变成 JSON 数字与布尔值,而带前导零或超过十五位的值仍然保持文本——这两条规则存在,是因为把它们变成数字会悄悄破坏数据。

与表头不一致的行会怎样?

短的行会补齐,长的行会截断,让表格保持矩形;这类行的数量会在结果里报告,并列出前几行的行号。手工写出的或从某个不一致的系统导出的 CSV 一定会有这种行,诚实的做法是说明它,而不是报错或者假装没发生。

我能自己决定 null、空字符串和缺失键怎么写吗?

不能逐项决定,原因值得了解:CSV 没有办法区分它们。缺失的键、空字符串和 null 最终都是一个空单元格,所以经过 CSV 往返之后无法保留这个区别——这是格式的限制,而不是这一页的限制。如果这个区别对你的数据很重要,就把它留在 JSON 里,CSV 只用来生成给人看的表格。

资料来源与统计口径

  • CSV 遵循 RFC 4180,JSON 遵循 RFC 8259,两个方向都按规范处理。
  • 以 `=`、`+`、`-` 或 `@` 开头的单元格默认加撇号前缀,表格软件无法执行它们;长度不齐的行会带行号说明。
  • 不上传任何内容,表格或 JSON 都在本地下载。

最近复核于 2026-09-16.

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