一份订单 JSON 里可能同时有买家、收货地址、商品数组和支付信息。程序读取它很自然,人要把它放进表格、做字段映射或交给另一位同事时,却常常不知道该从哪一层开始。JSON 扁平化与反扁平化工具可以把嵌套对象改成 user.contact.email 这样的路径字段,也可以把路径字段恢复成对象结构。但真正值得花时间的,不是点一下按钮,而是先决定哪些层级适合展开、数组要怎样表达、分隔符会不会撞上原始键名,以及恢复后是否仍然代表同一份数据。

2 个方向
嵌套结构与扁平结构双向转换
3 类检查
路径、数组和空值逐项核对
1 份交付
保留输入、规则和脱敏说明

JSON 扁平化到底解决什么问题

扁平化的核心,是把嵌套对象中的层级改写成带路径的键。例如,原始数据里的 user 对象包含 name 和 contact.email,展开后可以变成 user.name 与 user.contact.email 两个字段。它并没有删除信息,只是把“字段在哪里”写进了键名,方便表格、日志、字段映射工具或人工核对。

反扁平化则是相反方向:把 user.name、user.contact.email 这类路径拆开,重新组合成 { user: { name, contact: { email } } }。这很适合把表格处理结果、低代码平台字段或配置面板输出的路径数据还原成接口需要的嵌套 JSON。它不是“撤销所有编辑”的魔法,前提是路径没有冲突、分隔符一致、数组信息没有在中间步骤被丢掉。

先记住一个边界
扁平化改变的是数据的表达方式,不会替你判断业务含义。order.total 只是一个路径,工具不知道它是元、分,还是包含税费的总价;items.0.name 也只是数组中的第一个元素,不代表所有商品都有同样字段。

扁平化、反扁平化和 JSONPath 有什么区别

能力扁平化反扁平化
主要动作把层级写入字段路径把字段路径拆回层级
常见输入嵌套对象或对象数组带点号或自定义分隔符的字段
常见用途表格导出、字段清单、核对接口回写、配置还原、测试样例
最大风险数组和空值被看成普通字段路径冲突或分隔符不一致
是否筛选数据通常保留输入结构通常只负责恢复结构

这三件事很容易被混在一起。扁平化是结构变换,反扁平化是结构恢复,JSONPath 更像是“从结构中找到某些值”的查询表达式。比如你要找出所有订单的邮箱,JSONPath 可能更合适;你要把一份嵌套对象交给只接受一层字段的系统,扁平化更直接;你已经有 customer.address.city 这样的列名,要重新生成接口请求体,才需要反扁平化。

如果输入本身不容易读,先用 JSON 格式化工具整理缩进;如果只需要抽取几个路径,先用 JSONPath 查询工具定位字段。把不同问题都塞进扁平化步骤,通常会让结果看起来更长,却没有更清楚。

一套不容易返工的 JSON 扁平化流程

  1. 1
    先确认输入是完整 JSON
    去掉日志前缀、Markdown 代码围栏和截断内容,确认根节点是对象还是数组。若输入有语法错误,先用 JSON 格式化工具校验,不要把语法问题和扁平化规则混在一起。
  2. 2
    写清楚这次要解决的交付问题
    是为了导出表格、做字段映射、整理日志,还是为了把表格结果回写接口?同一份 JSON 在不同目的下可能需要不同的展开深度,不一定要把所有层级都摊成一层。
  3. 3
    检查键名与分隔符是否冲突
    默认点号适合常见路径,但如果原始键名本身有点号,例如 release.version,就要考虑使用下划线或其他稳定分隔符。分隔符不是装饰,它决定了后续能否可靠还原。
  4. 4
    先看输出结构,再做业务映射
    检查根字段、对象路径、数组下标、空数组和 null 是否仍然可辨认。不要在还没确认结构前就批量改名,否则出了问题很难知道是工具转换还是人工映射造成的。
  5. 5
    保存输入、规则和交付说明
    复制或下载结果时,同时记录模式、分隔符、数据时间和脱敏范围。需要同事复现时可以使用分享链接,但链接里的内容仍应先去掉 Token、手机号、地址等敏感字段。

字段路径怎么读,才不会把层级看错

对象层级:分隔符代表“进入下一层”

对象字段是最容易理解的一类。假设输入是 { "profile": { "name": "林晓", "verified": true } },扁平化后通常得到 profile.name 和 profile.verified。这里的点号不是原始数据的一部分,而是工具在扁平结果里提供的路径标记。反扁平化时,程序会按照点号把它们重新拆成 profile 对象。

数组下标:它记录位置,不等于业务主键

数组经常会被表示成 items.0.name、items.1.name。这个写法保留了元素位置,但 0 不是商品编号,也不保证下一次数据排序后仍然指向同一件商品。如果你要做长期数据同步,应另外保留 items.0.id 这样的业务标识,不能只靠数组下标判断“这是哪条记录”。

空数组与缺失字段:没有值也可能有意义

空数组可能表示“当前确实没有商品”,缺失字段可能表示“该场景没有返回这个字段”,null 可能表示“字段存在但暂无值”。扁平化后的结果如果没有对应键,不能自动推断这三种状态完全相同。对接口、报表和配置来说,是否保留空值应由交付约定决定,不能只为了让字段数量看起来整齐就全部补空字符串。

键名冲突:原始字段可能长得像路径

如果原始对象里本来就有一个键叫 user.name,同时又有 user 对象下的 name,那么用点号扁平化后可能出现两个含义相近甚至冲突的路径。遇到这类数据,应先确认工具对特殊键名的处理方式,或者选择不会出现在原始键名中的分隔符。不能指望反扁平化凭上下文猜出你最初的意图。

3 个常见场景:什么时候展开,什么时候别展开

实操案例

把接口响应整理成字段清单

后端给了一份订单详情响应,产品和测试需要一张字段清单,里面要列出买家姓名、收货城市、订单状态和商品名称。直接阅读多层括号很慢,但把所有值复制到表格也会失去字段路径。
  1. 1.先用 JSON 格式化工具确认响应没有截断,并删掉真实订单号、电话和地址。
  2. 2.扁平化后保留路径字段,例如 buyer.name、shipping.city 和 items.0.name,不要只留下中文显示名。
  3. 3.把“字段路径、示例值、类型、是否必填、备注”作为表格列,避免把路径本身混进业务备注。
  4. 4.如果商品有多条,单独说明数组表达方式,不要让 items.0 被误认为订单只有一个商品。
得到什么:得到的是一份可以复核的字段清单:别人能知道值来自哪一层,也能看出哪些字段属于数组。它比“复制一段 JSON 到 Excel”更适合讨论接口契约。
实操案例

把低代码表单字段还原成接口请求体

一个表单平台输出的是平铺字段,例如 customer.name、customer.address.city 和 payment.method。后端接口却要求嵌套对象,人工逐层加括号很容易漏掉字段。
  1. 1.先统一字段分隔符,并确认所有列名使用同一套路径规则,不要一半用点号、一半用下划线。
  2. 2.使用反扁平化恢复对象后,检查根层级、同名字段和数组路径是否符合接口要求。
  3. 3.把金额、日期、布尔值和编号按接口约定复核,结构还原不等于类型和单位校验。
  4. 4.提交到测试接口前用 API 测试工具发送脱敏样例,确认服务端真正收到的 JSON 结构。
得到什么:结构转换和接口验证各自回答一个问题:前者确认字段能不能组回去,后者确认服务端是否按预期接收。两步都做,才不会因为“JSON 看起来正确”而漏掉业务约束。
实操案例

整理日志或事件数据做一次性分析

日志事件里有多层 metadata,分析人员只想比较设备型号、地区和事件状态。原始 JSON 结构保留得很完整,但分析表只需要少数几个字段。
  1. 1.先用 JSONPath 查询工具确定真正需要的字段,不要为了方便而把每个调试字段全部展开。
  2. 2.仅对需要交付的对象做扁平化,并标记事件时间、样本范围和脱敏方式。
  3. 3.把数组字段单独处理:如果一个事件有多个标签,决定是保留下标列、拼接文本,还是拆成另一张明细表。
  4. 4.分析结束后保留一份原始结构与扁平结果的对应关系,避免下次无法解释某一列从哪里来。
得到什么:扁平化不再是“把所有东西都摊开”,而是服务于一个明确的分析问题。少展开一些,反而更容易让表格可读、口径稳定、后续复现。

数组是扁平化里最需要提前决定的地方

对象通常可以沿着键名逐层展开,数组则会引出一个问题:一行数据到底代表什么?如果一个用户有多个地址,展开为 addresses.0.city、addresses.1.city,你得到的是“一个用户一行、多个位置列”;如果一个订单有十件商品,同样的方式会产生大量列,而且不同订单的最大商品数量还不一致。它能保留位置,却不一定适合表格分析。

更稳定的思路,是先确定主实体和明细实体。订单基本信息放在订单表,商品数组作为订单明细表,并使用订单 ID 关联。若当前工具只负责扁平化,至少应在交付说明里写清楚数组采用了下标路径,后续使用者不要把 items.0.name 与 items.1.name 当成两个永远固定的业务字段。

不要把数组下标当成永久身份
数组排序变化、插入新元素或删除旧元素后,下标会移动。需要追踪同一对象时,优先使用元素里的业务 ID;没有 ID 时,在交付中明确“该字段只代表当前快照中的位置”。

分隔符怎么选:点号不是永远正确

点号短、常见、可读性好,所以适合大多数普通 JSON。但它有一个前提:原始键名里没有同样的点号,或者工具能明确区分“路径分隔符”和“原始键名”。当数据来自外部系统、键名不可控时,下划线、双下划线或其他约定可能更稳。选择标准不是哪个符号更漂亮,而是能不能让反扁平化唯一地恢复结构。

自定义分隔符之后,要把它当成交付规则的一部分记录下来。只保存扁平结果、不保存分隔符,过几天再恢复时就可能把一列完整字段拆错。分享链接若能保存输入、模式和分隔符,会比只分享输出文本更容易复现现场;但分享前仍应先脱敏,因为编码不等于加密。

交付时不要只给一份扁平结果

扁平 JSON 很适合传递,但单独发送它,接收者往往还要猜四件事:原始输入是什么、使用了哪种模式、分隔符是什么、数组如何处理。我的建议是把交付内容拆成“结果 + 规则 + 边界”三部分。结果是工具输出,规则说明路径和分隔符,边界说明空值、数组和敏感字段的处理方式。这样别人接手时,不必靠试错还原你的操作过程。

  • 输入来源写清是接口响应、配置样例、日志快照还是表单导出,并记录数据时间。
  • 处理模式标明扁平化还是反扁平化,不能只靠文件名中的“new”或“result”猜。
  • 分隔符写出实际字符,并指出原始键名是否允许出现它。
  • 数组规则说明是否使用下标、是否拆成明细,以及下标能否代表业务身份。
  • 空值规则区分缺失、null、空字符串和空数组,不要统称为“没有数据”。
  • 安全边界删除 Token、Cookie、私钥、内部域名、手机号和真实客户信息,再生成分享链接。
  • 复核方式对反扁平化结果重新格式化,抽查根层级、数组数量和关键字段,而不是只看文本长度。

和其他 JSON 工具怎样搭配才不绕

一份数据可能需要经过多个处理,但每个工具最好只回答一个问题。输入不合法时回到 JSON 格式化工具;只需要抽取路径时使用 JSONPath 查询工具;需要把嵌套结构改成路径字段时使用扁平化工具;要恢复接口请求体时再反扁平化;如果最终数据来自表格,还可以用 CSV 转 JSON 工具继续转换。

这套组合的好处是出了问题容易定位:格式化阶段解决语法,查询阶段解决范围,扁平化阶段解决层级,CSV 转换阶段解决表格边界,API 测试阶段验证服务端行为。工具越多不一定越专业,关键是不要让一个步骤同时承担清洗、筛选、类型推断和业务校验。

分享、下载或回写前的 12 项检查清单

  • 原始输入是合法且完整的 JSON,没有日志前缀和 Markdown 围栏。
  • 已经确认根节点是对象、数组,还是需要先抽取其中一部分。
  • 已经写清楚扁平化的目标:表格、字段清单、日志分析还是接口回写。
  • 分隔符不会和原始键名冲突,或已记录特殊键名的处理方式。
  • 对象路径的层级与预期一致,没有把显示名称误当成原始键名。
  • 数组下标只被当作当前位置,没有冒充业务 ID。
  • 空数组、null、空字符串和缺失字段已按业务约定区分。
  • 数字、金额、日期、布尔值和编号没有因为转换而改变表达含义。
  • 如果结果要进表格,已经决定一行代表主实体还是数组明细。
  • 反扁平化后重新格式化并抽查根对象、嵌套层级和数组数量。
  • 分享链接只包含脱敏样例,未放入 Token、Cookie 或内部地址。
  • 需要接口回写时,已在测试环境用真实请求方式验证,而不是只看本地文本。

常见问题

JSON 怎么扁平化成一层字段?

先确认输入是合法 JSON,再选择扁平化模式并设定分隔符。对象层级通常会变成 user.profile.name 这样的路径键,数组常见写法是 items.0.name。转换后要检查数组、空值和特殊键名,不能只看结果是否“变成了一层”。

扁平化后的 JSON 可以还原吗?

可以使用反扁平化把路径键重新组合成嵌套对象,但前提是分隔符一致、路径没有冲突,数组信息也没有在中间步骤丢失。还原后建议重新格式化,并抽查根层级、数组数量和关键字段;结构能恢复不代表业务类型和单位也自动正确。

JSON 扁平化的分隔符用点号还是下划线?

点号可读性好,适合原始键名不含点号的普通数据;如果外部系统的键名可能包含点号,应选择不会与原始键名冲突的分隔符,并把规则写进交付说明。分隔符一旦改变,反扁平化时就可能把字段拆到错误层级。

JSON 数组扁平化后为什么出现 items.0、items.1?

这是用数组下标记录元素位置的一种表达方式。它能保留当前快照中的顺序,但下标不是永久业务身份,排序、插入或删除元素后会发生变化。需要长期追踪商品、地址或成员时,应优先使用元素自身的 ID,并在交付中说明数组规则。

JSON 扁平化可以直接转成 Excel 吗?

扁平字段适合继续整理为表格,但“字段变成一层”不等于自动得到合理的 Excel 表。你还要决定一行代表用户、订单还是数组明细,处理重复字段、空数组、日期和金额单位,再选择 CSV 或表格转换工具。复杂数组通常更适合拆成主表和明细表。

JSON 扁平化和 JSONPath 查询有什么区别?

扁平化主要改变完整结构的表达方式,通常保留许多字段,适合字段清单、映射和交付;JSONPath 主要用于从复杂结构中定位或抽取指定路径,适合只取少数字段。先明确你是要“改结构”还是要“找数据”,可以避免得到一份过长却没有用的结果。

分享 JSON 扁平化链接安全吗?

分享链接便于复现输入、模式和分隔符,但链接参数通常只是编码,不等于加密。生成链接前应删除 Token、Cookie、密码、私钥、手机号、客户地址和内部域名;如果内容仍然敏感,建议只分享虚构的结构样例,并把真实数据留在受控位置。