JSON 转 CSV

把 JSON 对象数组转换为符合 RFC 4180 的 CSV。自动将嵌套对象展平为点分列名,兼容字段缺失的记录,支持逗号、分号、制表符、竖线分隔符以及 Excel BOM。

把记录摊平成表格。 粘贴一个对象数组,即可得到带表头的 CSV。嵌套对象会变成点分列名,缺失字段留空,包含分隔符的值会按 RFC 4180 加引号。

把树变成表

形状不匹配

JSON 是一棵树,CSV 是一个矩形,因此任何转换都必须决定如何处置树上放不进矩形的部分。唯一能干净映射的形状是「扁平对象组成的数组」:每个对象一行,每个键一列。除此之外的一切都需要额外的规则。

嵌套对象是容易的一类。{"role": {"team": "core"}} 会变成名为 role.team 的列,既保留了取值路径,也能被绝大多数电子表格导入向导识别。嵌套数组更棘手,因为展开它们会改变行数,并悄悄复制周围的数据。本工具把它们作为 JSON 文本保留在单个单元格里——牺牲了可查询性,但绝不会凭空造出源数据里没有的记录。

字段缺失与列顺序

真实世界的 JSON 很少整齐划一。这条记录有 nickname,下一条没有;某个字段只在某次迁移之后才出现。如果转换器只根据第一个对象确定列,其余字段就会被悄无声息地丢掉。

这里的列表是所有记录中全部键的并集,按首次出现的顺序排列。缺少某字段的记录会得到一个空单元格,而不是被跳过,因此行数始终与输入的记录数一致。选择首次出现顺序而非字母序,是为了保留作者原本的分组意图——idname 会留在最前面,而不会被打散。

引号、分隔符与 Excel

RFC 4180 规定:字段若包含分隔符、双引号或换行,就必须加引号,而内嵌的双引号通过写两遍来转义。本工具对每个单元格(包括表头)都应用这条规则,因此 Grace, Jr. 这样的值或多行地址能够完整地通过任何合规解析器往返。

分隔符的选择比看上去重要。在以逗号作小数点的地区——欧洲大陆的大部分国家——Excel 期待的是分号,否则整行都会被塞进 A 列。BOM 选项会在文件开头加上 UTF-8 字节序标记,正是它告诉 Windows 版 Excel 按 UTF-8 而不是旧式代码页读取;没有它,非 ASCII 的名字会变成乱码。这两个选项都不在默认路径上,恰恰因为它们会让其他工具出问题——只在给 Excel 用时才打开。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

它期望什么样的输入结构?
一个对象数组,每个对象对应一行。单个对象也接受,会输出一行;但由字符串或数字组成的数组无法变成表格。
嵌套对象是怎么处理的?
会被展平成点分列名,例如 {"role": {"team": "core"}} 变成名为 role.team 的列。关闭展平则会把它们保留为 JSON 文本。
为什么嵌套数组保留为 JSON?
展开数组会改变行数并复制周围字段。把它放在一个单元格里,可以保证输出的行数始终等于输入的记录数。
各条记录的键不一样时会怎样?
表头取所有记录全部键的并集,按首次出现的顺序排列;缺少某字段的记录得到空单元格。不会跳过任何记录。
什么时候该打开 BOM 选项?
只在给 Windows 版 Excel 用时打开。字节序标记会让它按 UTF-8 读取,否则非 ASCII 字符会显示为乱码。其他工具可能会把 BOM 显示成多余字符。
为什么文件在 Excel 里全挤在一列?
Excel 遵循系统区域设置的列表分隔符。在用逗号作小数点的地区它期待分号,把分隔符改成分号后重新打开即可。