数据 · 阅读约 4 分钟 ·
JSON 转 CSV,一个字段都不丢
嵌套键、可选字段、字符串里的逗号:4Dev 如何把杂乱的 JSON 展平成可直接用于电子表格的 CSV。

电子表格是平的,JSON 不是。每次把 JSON 转成 CSV,都要决定如何处理嵌套对象、数组,以及只在部分记录中出现的键。下面就是 4Dev 转换器的具体做法。
每个键都有自己的一列
表头由所有对象的键组成,按首次出现的顺序排列,而不只是取第一条记录。缺少某个键的记录会得到一个空单元格,因此列不会错位,可选字段也不会丢失。
[{"id":1,"name":"Ada"},
{"id":2,"name":"Alan","note":"optional"}]
id,name,note
1,Ada,
2,Alan,optional
嵌套对象变成带下划线的列
对象会通过下划线连接键名来展平,所以 {"address":{"city":"Lisbon"}} 会变成名为 address_city 的列。简单值组成的数组放进同一个单元格("admin, dev"),对象数组则以 JSON 文本保存在单元格中,什么都不会被丢掉。
逗号和引号自动转义
任何包含逗号、双引号或换行的值都会用双引号括起来,内部的引号会被双写。这是 Excel 和 Google 表格所期望的标准 CSV 规则。
2,"Alan, T.","says ""hi"""
用 Excel 打开 CSV
CSV 本身没有任何设置,所以 Excel 只能猜。常见的问题有两个。在用逗号作小数点的国家,Excel 期望列之间用分号,可能把整行塞进一个单元格。另外,如果文件按本地编码而不是 UTF-8 打开,中文、希伯来文、带重音的字母或表情符号就会变成乱码。这两种情况都可以在 Excel 中使用“数据 → 从文本/CSV”,选择 UTF-8 和逗号分隔符,列就会正确显示。
前导零和长数字
电子表格会把所有看起来像数字的内容当作数字。像 01234 这样的邮编会丢掉开头的零,像 1234567890123456 这样的 16 位 ID 会被四舍五入并显示为 1.23457E+15。CSV 本身是正确的;问题出在 Excel 打开它的时候。把这些列按文本导入,并在 JSON 中把长 ID 作为字符串发送("id": "1234567890123456"),这样每个工具都会原样保留它们。
记录中的数组
数组是任何转换中最难的部分,因为一条记录可以包含很多值,而 CSV 的一行每列只有一个单元格。把它们拆成多行,会让其他所有字段重复;拆成编号列(tags_1、tags_2……),每个文件的表头又会不同。把简单值的列表放在一个单元格里,把对象数组作为 JSON 文本保存,每条记录就始终正好是一行,需要时也能还原原始数据。
分享前先检查结果
- 行数与 JSON 数组中的记录数一致。
- 表头包含所有预期字段,包括可选字段。
- 嵌套字段显示为带下划线的列,例如 address_city。
- 含有逗号、引号或换行的值仍在同一个单元格里。
需要电子表格或反向转换?
4Dev 的 JSON 转 CSV 工具每次都使用同样的扁平化规则,JSON 转 Excel 和 CSV 转 JSON 工具则覆盖了其他常见情况。想快速检查的话,先粘贴几条记录,看看列是否正确,再转换整个文件。