JSON 转表格:嵌套字段怎么摊平成列
办公与文档发布于 2026-10-31
接口返回一段 JSON,要交给不做开发的同事看。最省事的做法是截图,但截图里的数不能筛选、不能求和、不能引用。
转成表格才是正解。而「转成表格」这件事,真正的决策点只有一个:嵌套的部分怎么办。
先确认顶层是不是数组
表格的本质是「行 × 列」,所以能直接转的前提是数据本身是「一组同类对象」:
[
{ "id": 1, "name": "张三", "dept": "销售" },
{ "id": 2, "name": "李四", "dept": "技术" }
]
这是理想情况:每个对象的键就是列,每个对象就是一行。
如果顶层是一个对象({ "code": 0, "data": [...] }),要先取出 data 那个数组 —— 把 code、message 也当列的行没有意义。判断方法很简单:要让所有行长得一样,就只能取那个「重复出现的结构」。
三种嵌套形态,三种处理
一、对象套对象
{ "id": 1, "user": { "name": "张三", "age": 30 } }
有两种摊法:
| 摊法 | 列名 | 好处 | 坏处 |
|---|---|---|---|
| 路径式 | user.name、user.age |
不丢信息,能还原成原结构 | 列名长,人看着累 |
| 拍平式 | name、age |
好看 | 两个不同层级同名时会互相覆盖 |
默认该用路径式。因为覆盖这件事是静默的:user.name 和 company.name 同时拍平成 name,后写的那个赢了,表里没人看得出来少了什么。
只有在确定不会重名时,拍平才划算。
二、对象里带数组
{ "id": 1, "tags": ["新客", "VIP"] }
一格放一个数组,读者看到的是 ["新客","VIP"],比丢了强,但不能筛选。
要筛选就只能拆列(tag1、tag2…),代价是列数由最长的那个决定,短的行留空,而「第 3 个标签」这个语义本身也很脆弱。
实践中的折中:用分隔符拼成一个单元格,比如 新客 | VIP。能读、能筛「包含 VIP」,也不制造一堆空列。
三、数组里带数组(最麻烦的一种)
[
{ "order": "A1", "items": [{ "sku": "x", "qty": 2 }, { "sku": "y", "qty": 1 }] },
{ "order": "A2", "items": [{ "sku": "z", "qty": 5 }] }
]
此时「一行」到底是什么,取决于你接下来要算什么:
- 按订单统计 → 一行一个订单,
items拼成文本或只取数量合计 - 按商品统计 → 一行一个商品,订单字段重复到每一行(笛卡尔展开)
第二种会让行数从 2 涨到 3,如果还有第二个数组字段,就是乘积。在展开前一定要先算一遍行数,否则一张 200 条订单的表能炸成几万行。
经验规则:表格只能表达一层「一对多」。出现两个以上的一对多,正确做法是先拆成两张表(订单表 + 明细表),用
order关联,而不是硬塞进一张宽表。
转成什么格式,取决于给谁看
| 目标 | 用什么 | 理由 |
|---|---|---|
| 发给同事、贴进邮件 | JSON 转 HTML 表格 | 对方双击就能看,不用装软件 |
| 写进文档、技术方案 | JSON 转 Markdown 表格 | 纯文本,能进版本库,Git diff 可读 |
| 继续在 Excel 里算 | JSON 转 CSV | Excel / WPS 直接打开 |
| 要写代码读这段数据 | JSON 转类型定义 | 先把结构定下来,比对着 JSON 手敲 interface 快 |
转 CSV 前先想一件事
CSV 是纯文本,没有类型。JSON 里的 null、true、数字 30 落进 CSV 全变成字符串,再被 Excel 打开时又会按内容猜类型:true 可能被认成布尔,00123 会被吃掉前导零,18 位 ID 会变科学计数法。
如果这份 CSV 还要被程序读回去,别让 Excel 碰它。如果一定要给人看,那就接受「表格只是快照」这个事实 —— 见CSV 乱码那篇里的导入向导做法。
三个检查点
转完别急着发,扫一眼这三件事:
- 列数对不对。如果只有 2~3 列,八成是顶层取错了(取到了外层对象而不是
data数组)。 - 有没有成片的空列。这通常意味着某些行有、某些行没有某个字段,逐行摊平会补齐成空 —— 空值和「真的没有」在表格里长一样,必要时加一列标记。
- 数字是不是右对齐。左对齐的数字是文本,后面求和会得 0。
反向也要会
表格转 JSON 同样常见:产品给了一张字段说明表,要变成 mock 数据;或者 CSV 导出的配置要变成 JSON。
CSV ↔ JSON 互转两个方向都支持,转的时候注意表头就是键名 —— 表头写成「用户 名」(带空格)会让程序取不到 用户名,而这一点在表格里完全看不出来。所以表头要么全中文且无空格,要么直接用英文键名。
一句话总结:表格只能承载一层一对多。嵌套超过一层,先想清楚「一行代表什么」,再决定摊平还是拆表;摊平用路径式列名,别用拍平式。