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 乱码那篇里的导入向导做法。

三个检查点

转完别急着发,扫一眼这三件事:

  1. 列数对不对。如果只有 2~3 列,八成是顶层取错了(取到了外层对象而不是 data 数组)。
  2. 有没有成片的空列。这通常意味着某些行有、某些行没有某个字段,逐行摊平会补齐成空 —— 空值和「真的没有」在表格里长一样,必要时加一列标记。
  3. 数字是不是右对齐。左对齐的数字是文本,后面求和会得 0。

反向也要会

表格转 JSON 同样常见:产品给了一张字段说明表,要变成 mock 数据;或者 CSV 导出的配置要变成 JSON。

CSV ↔ JSON 互转两个方向都支持,转的时候注意表头就是键名 —— 表头写成「用户 名」(带空格)会让程序取不到 用户名,而这一点在表格里完全看不出来。所以表头要么全中文且无空格,要么直接用英文键名。


一句话总结:表格只能承载一层一对多。嵌套超过一层,先想清楚「一行代表什么」,再决定摊平还是拆表;摊平用路径式列名,别用拍平式。