Command Palette

Search for a command to run...

JSON Flattener:将嵌套的 JSON 转换为点符号键并返回

JSON Flattener:将嵌套的 JSON 转换为点符号键并返回

T
Toolz Team
|Aug 23, 2026|16 最小读数

数据工具 合集的一部分

教我尊重扁平化的任务在票面上看起来很无聊:"将设置对象导出到电子表格中,以便客户端可以编辑它。"设置是从 Laravel 配置中深嵌套的 JSON 斑点,三个和四个级别深处,混合了功能标志阵列。电子表格有列,而不是树。我需要每个叶子值作为客户端可以在一行中看到的单个扁平键,编辑并反手,然后我需要从他们的编辑中重建精确的嵌套结构,而不会丢失单个阵列索引。那次往返,嵌套到扁平,平坦回到嵌套,JSON 扁平化器就是这样做的,并且使其无损是整个游戏的工具 JSON 扁平化剂 是我为这项工作构建的工具,本指南解释了它是如何工作的以及它在哪里可以为您节省开支。

TL;博士: JSON 平坦器将嵌套对象转换为单级对象,其键是每个值的路径,因此 {"user":{"city":"Austin"}} 变成 {"user.city":"Austin"}。数组在路径中随着它们的索引而变平(roles.0)。解平反转它,从那些虚线键重建嵌套对象和数组。toolz工具无损地双向执行,保留空对象和数组,支持点或括号数组表示法和自定义分隔符,完全运行客户端,没有上传,没有注册。

Laravel 和 React 上构建 SaaS,并运送 WordPress 插件,所以在我那个时代,嵌套的 JSON 到处都是:配置文件、API 有效负载、i18n 消息目录、功能标志存储。消耗那些有效负载的系统,不过,经常想要平键。平键是结构化数据自然形状和电子表格、环境变量和虚线密钥存储自然形状之间的适配器。它是一个小操作,可以悄悄地解锁许多原本烦人的任务。

什么是 JSON 压平机?

JSON 扁平化器将嵌套的 JSON 对象转换为单级对象, 其中每个键都是从根到叶值的完整路径, 路径语法也不是任意的: RFC 6901 定义 JSON Pointer,即在文档内寻址一个值的标准方法。嵌套的 {"user":{"name":"Ada","address":{"city":"Austin"}}} 成为公寓 {"user.name":"Ada","user.address.city":"Austin"}。价值观没有任何变化;只有他们的寻址才有。每一片叶子,无论多么深,都会得到一个关键,它阐明了如何到达它。

Arrays 的处理方式相同, 数组索引成为路径段: {"roles":["admin","editor"]} 压扁至 {"roles.0":"admin","roles.1":"editor"}。key中的索引是让反向操作按照正确的顺序重建数组的,那个反向操作,unflatten,取一个虚键的平坦对象,并重建嵌套的对象和数组,在每一步决定路径段命名对象属性还是数组索引,当flatten和unflatten使用相同的分隔符和数组表示法时,它们是精确的逆,而那个无损往返是使工具在实际工作中值得信赖的属性,而不是单向的便利。

为什么我一开始会压平 JSON?

因为很多系统只说平键值对,虚线路径是将嵌套结构通过它们而不丢失的标准方式,最清晰的例子是电子表格,电子表格是列的网格,没有列用于"用户内部地址内的城市"将对象平坦化 user.address.city 成值可以活在下的单列头,这正是我的设置-导出票证所需要的。

1样形态在其他很多地方都出现了。环境变量和 .env 文件是平坦的,映射到配置的工具使用虚线或下划线的路径。国际化库使用虚线路径键入字符串,例如 checkout.button.label。特征标志平台、分析事件模式和大量日志记录管道都想要一个级别的密钥,通常这样它们就可以独立索引或查询每个字段。在每种情况下,嵌套是真实且有意义的,并且平坦化将其保留在路径中而不是丢弃。当平坦表示已达到其目的时,不平坦化会重建原始对象。如果您还在 JSON 和电子表格之间移动,具体来说, CSV 到 JSON 转换器 是那次旅行的表格腿的天然伴侣。

压平时如何处理阵列?

Arrays是人们最常出错的部分,所以值得精确,一个数组元素用它的数字索引作为路径段被平坦化,它保留了顺序,让数组被精确地重建。Toolz工具为那个索引提供了两种符号,它们用不同的语法编码相同的信息。

输入 点符号 括号符号
{"roles":["admin","editor"]} roles.0roles.1 roles[0]roles[1]
{"items":[{"id":1}]} items.0.id items[0].id
{"matrix":[[1,2]]} matrix.0.0 matrix[0][0]

点符号写道 roles.0的,它很紧凑,匹配多少个config和i18n系统键他们的值,括号表示法写入 roles[0]的,它反映了JavaScript访问语法和一些查询语言使用的路径样式。两者都不是更正确的;你选择另一端系统期望的。重要的是一致性:无论你用什么符号平坦,都使用同一个来解平坦,因为这就是工具知道数字段的意思"数组索引"而不是"恰好是一个数字的对象键。"工具z平坦器默认点符号,让你一键切换到括号。

如何使用 JSON 压平机?

Flow 有两个方向和几个选项,从选择平坦或未平坦开始,顶部是拨动,Flatten 采用嵌套 JSON,产生虚线键;unflatten 采用虚线键,重建嵌套结构,加载样本填入工作示例,无论您处于哪个方向,因此在粘贴自己的数据之前,您都可以看到输入和输出的形状。

JSON粘贴到输入框中,对于flatten,那是一个嵌套对象;对于unflatten,它是一个键为虚线路径的平坦对象,输入必须是有效的JSON,如果不是,工具会报告解析器's消息和问题的位置,而不是给你一个空白输出,所以一个杂散的尾随逗号很快就能找到。设置键样式:分隔符默认为一个点,当你的键已经包含点时可以更改,数组符号切换之间 roles.0roles[0].保持这两个设置相同,跨越一个平坦,它的匹配不平坦,所以往返行排队,点击动作按钮,检查确认生产了多少叶子的键计数,并复制输出或下载为a .json file。thing运行的瞬间你点击, 在你的浏览器, 没有任何发送到任何地方。

压平是无损的,边缘情况是什么?

Toolz工具来说,是的,有一个边框的情况值得了解。标量, null、布尔值、数字未受触碰而存活下来,微妙的部分是空容器:一个空物体 {} 或者一个空数组 [] leaf值保存,而不是默默掉落,所以依赖空列表的config还是往返到原来的样子,很多天真的压扁器丢失了空容器,这悄悄地改变了文档的含义,所以这是一个刻意的选择。

真正的一个限制是已经包含分隔符的键。如果您的数据有一个对象键,其中有一个字面点,就像 {"a.b":1}并且您用点分隔符压平,路径就会变得模糊:不压平无法判断是否 a.b 是一把钥匙还是嵌套的 a 然后 b。修复的是将分隔符改为键中没有出现的字符,比如斜杠或管道,两个方向都使用那个相同的分隔符,是你看到的同一类转义问题 CSV分隔符与数据发生冲突并且适用相同的解决方案:选择一个您的值不包含的分隔符。在这种情况下,使用匹配设置的 flatten 后跟 unflatten 准确地再现原始文档,包括数组和空容器。

压平和转换为另一种格式有什么区别?

Flattening 不是格式转换;而是 JSON 内部的重组,flatten 的输出还是 JSON,只是单级的虚键而不是嵌套,那不同于将 JSON 变成真正不同的序列化的转换器,知道你需要哪一个可以节省一步。

如果您想要与配置文件的 YAML 表示相同的数据,则 JSON 到 YAML 转换器 is the tool,因为它改变了语法而不是形状,如果你想要一个描述结构的typescript界面,这样你的前端就知道它正在处理什么,the JSON 到 TypeScript 转换器 从样本中推断出。如果您想要正式的合同进行验证,则 JSON 模式生成器 json 模式从一个例子中导出。flattening 坐在这些旁边而不是替换它们:当下游系统想要一个级别的密钥时,你会平坦,当系统想要不同的语言时,你会转换。我经常按顺序执行这两项操作,平坦一个有效负载以将其编辑为列,然后,单独,为我交给 React 的嵌套版本生成类型。用于在该链中的任何一点漂亮地打印或验证 JSON, JSON 格式化程序 是我在下一个选项卡中保持打开的实用程序。

unflatten 如何在数组和对象之间做出决定?

Zhe是使往返工作起作用的机制,理解它既解释了工具's默认值,又解释了它的一条锋利边缘,当不平坦时读取像这样的键 user.roles.0it将其分割成几段 userroles、和 0(building structure),然后随行走他们,每一步它都看下一个段来决定要创建什么样的容器,如果下一个段是非负整数,它就做一个数组;如果是其他任何东西,它就做一个对象,所以 roles.0 告诉工具那个 roles 应该是一个数组,其第一个元素是值,而 address.city 告诉它 address 应该是一个带有 a 的对象 city 财产。

That single rule,"整数段表示数组索引,"是为什么一个带匹配设置的flatten和一个unflatten恰好再现数组的原因,也是你选择的数组表示法必须一致的原因,在点表示法中数组索引和一个对象键都只是点之间的文本,所以工具完全依赖于整数测试,在括号表示法中 [0] syntax使意图在分裂发生之前就显而易见,要么工作,但混合它们,用括号压平,用点不压平,打破工具所依赖的信号。

这是从规则中得出的锐边:一个对象,其键实际上是字符串 "0""1""2" 是无法区分的,一旦被压平,就与一个数组。两者都产生键 012(unflatten) 会将它们重建为数组,因为那是压倒性的常见情况。如果您确实需要一个带有数字字符串键的对象才能在往返中生存,那么平坦和不平坦不会给您返回确切类型,并且最好将该对象嵌套或使用非数字键方案。在这样做的多年里,我恰好两次击中了该情况,两次都是在可以说一开始就建模错误的数据中,因此默认值是几乎所有人的正确交易。将前导零的数字保留为字符串的背后,这是一种务实的决定 CSV 到 JSON 转换器:该工具针对数据几乎总是意味着什么进行了优化,并记录了罕见的异常,而不是使公共路径变得尴尬。

我的 JSON 粘贴到此工具中安全吗?

是的,而且它是架构而不是承诺 解析、平坦、不平坦和序列化都以 JavaScript 形式运行在您自己的浏览器选项卡内 没有上传,没有服务器往返,也没有记录或存储任何内容 打开您的浏览器's 网络选项卡,单击操作按钮:没有请求退出 页面加载后,您可以断开与互联网的连接并继续工作,因为一开始循环中从未有服务器。

这比看起来更重要,因为 JSON 有效负载正是承载秘密的东西:配置中的 API 令牌、API 响应中的个人数据、设置 blob 中的内部标识符。将对象上传到服务器的扁平化器会将私有有效负载变成其他人's 日志行。客户端处理完全消除了风险,这就是为什么它是 toolz。dev 上每个工具的默认值。如果您想要完整的推理,我将其放在 在线工具的数据隐私指南并且我用于此类工作的更广泛的套件是在我的 web开发人员工具包指南

常见问题

JSON 压平是什么意思? Flattening JSON 将一个嵌套对象转换为一个单级对象,其键为每个值的路径。嵌套的 {"user":{"city":"Austin"}} 成为公寓 {"user.city":"Austin"}.每个叶值得到一个虚键,输出中不残留嵌套,不压平反转过程,重建嵌套结构。

压平时如何处理阵列? 使用其索引作为路径段来平坦数组元素。 {"roles":["admin","editor"]} 变成 {"roles.0":"admin","roles.1":"editor"} 用点符号表示,或者 {"roles[0]":"admin","roles[1]":"editor"} 在括号表示法中。索引保留了顺序,因此可以在您解平时精确地重建数组。

我可以将虚线键解平回到嵌套的 JSON 中吗? Yes。切换到unflatten模式,粘贴一个键为虚线路径的平面对象,工具重建嵌套对象和数组,通过每个路径段是否为整数索引来决定数组与对象的平坦和不平坦,在分隔符和数组符号匹配时是精确的反。

点数组和括号数组表示法的区别是什么? 2者编码相同的数组索引;只有语法不同点表示法写 items.0.idconfig 和 i18n 键中小巧常见,括号表示法写入 items[0].idjavascript 访问语法和一些查询语言相匹配的,选择你的目标系统期望的哪个,两个方向都使用同一个。

压平会丢失任何数据吗? 号标量、空、布尔值,甚至空对象和空数组都作为叶值保存,所以将结果解平再现原始文档,值得关注的一点是已经包含你的分隔符的键,这就是为什么分隔符是可配置的。

为什么我会把 JSON 压扁? Flattening使嵌套数据适应期望一级密钥的系统:电子表格列、环境变量、虚线翻译密钥、特征标志存储以及许多分析和日志记录管道。虚线路径通过平面格式承载原始结构,因此不会丢失任何内容。

如果密钥已经包含点会发生什么? Key 内部的字面点与路径分隔符是模棱两可的,因此往返可以在错误的地方将其分割。将分隔符更改为键中未出现的字符,例如斜杠或管道,并使用相同的分隔符来表示平坦和不平坦。

我的json是否上传到任何地方? No。Parsing和transform在你的浏览器中以JavaScript运行。没有传输,记录或存储任何内容。您可以通过在平坦化时查看网络选项卡或通过离线来确认这一点,因为该工具在没有连接的情况下一直工作。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!