将JSON转换为CSV
把API返回结果、导出文件和JSON Lines转成能在Excel中干净打开的CSV——自动找到记录列表,嵌套字段展平成易读的列,大ID逐位保留。
- 绝不存储
- 无需排队,无需等待
- 无需注册,无水印
使用方法
添加JSON
拖放.json或.jsonl文件,或者直接把JSON粘贴到输入框中。
选择记录
记录列表会被自动找到,即使深藏在data.items里面。选择数组的写出方式,并检查预览。
下载
一个按您需要的分隔符和编码生成的CSV,可直接用于Excel、Google表格或数据库。
把树形结构压平成表格
JSON是一棵树,CSV是一个矩形,整个转换就是解决如何从前者变成后者的问题。最干净的情况是所有对象都拥有相同键的对象数组——每个对象是一行,每个键是一列,什么都不会丢失。大多数API返回结果和导出文件都是这种样子,这也是为什么转换通常直接就能成功。所有麻烦都来自不是这种结构的文档。
嵌套对象通过拼接键名来展平,所以客户里面的地址对象会变成address.city和address.postcode这样的列——每种电子表格都能处理这种约定,但没有任何标准对它做出定义。只在部分对象中出现的键,会成为在缺少它的行里为空的列,这是正确的做法:否则就得丢弃只有部分记录才有的数据。
嵌套数组才是表格真正无法跟上的地方。一条内含三行订单明细的记录,是包含一个列表的一行,而不是三行——把它变成三行会重复其他所有字段,悄悄改变数据的含义。所以只有一个对象数组会被展开成多行,其他数组都以文本形式写入所在的单元格。如果您需要的是订单明细而不是订单,请把转换指向那个数组;一棵并列包含两个列表的树没有唯一正确的矩形,选择哪一个,只有您自己能决定。
输出时有两个细节容易踩坑。包含逗号、引号或换行符的值会被加上引号以保证完整——这是正确的CSV,但查看原始文件时会觉得奇怪。另外,一个很长的数字标识符一旦进入电子表格就有风险:Excel会把它读成数字,超过15位就舍入,还会去掉前导零——这个问题是电子表格带来的,而不是转换造成的。
如果您需要的是别的
当结构需要明确决定而不是靠猜时,jq 才是合适的工具:jq -r '.orders[] | [.id, .customer.name, .total] | @csv' 能从您想要的层级精确选出您想要的字段,这正是自动展平工具无法提供的控制力。它还支持流式处理,所以文件大小不再是问题。
对于一般的嵌套数据,Miller——mlr --ijson --ocsv flatten——和Python的 pandas.json_normalize 能让您明确控制展平的深度以及如何处理列表。如果JSON本身确实是层级结构而不是表格结构,把它转成CSV可能从一开始就不是好主意——数据库或按行分隔的JSON文件能保留表格即将丢弃的结构。
常见问题
嵌套的JSON是怎么变成列的?
每个嵌套字段变成一列,以其路径命名:{"address": {"city": "Oslo"}}会生成一列address.city。列按照在数据中首次出现的顺序排列,而不是按字母顺序;缺少某个字段的记录,对应单元格留空即可。
数组怎么处理?
由您选择:把值合并到一个单元格("red; green"),分散到带编号的列中(tags.0、tags.1),保留为JSON文本,或者——对于订单明细这样的对象数组——每一项写成一行,并重复父级字段。
大数字能精确保留吗?
能。超出JavaScript表示范围的ID——Twitter、Discord和64位数据库ID——会逐位复制,而大多数转换工具会悄悄把1234567890123456789舍入成1234567890123456800。
支持JSON Lines(NDJSON)吗?
支持。每行一个JSON对象的文件会被自动识别,每一行都会成为一行数据。
如果我的JSON有错误怎么办?
您会看到确切的行号和列号,出错的文本会被高亮,并附上通俗易懂的说明——比如末尾多了一个逗号,或者从JavaScript代码里复制来的单引号。
我的数据会被存储吗?
不会。JSON在这里读取,CSV也在这里生成;不会发送到任何地方,也不存储任何文件。
小贴士: 一次只能把一个对象数组展开成多行;其他数组会写入其所在的单元格。非常大的文件受限于浏览器的内存。
把这个工具放到您的网站上
博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。