本文目录
什么是 JSON 扁平化?
JSON 扁平化会使用点号路径把深度嵌套的 JSON 对象转换为扁平的键值结构。原对象中的每个叶子值都会获得一个唯一的路径,比如 'user.address.city',用来描述它在层级中的位置。
与之相反的操作是反扁平化,它会根据点号路径重建出原有的嵌套结构。扁平化和反扁平化配合使用,让你能够在嵌套表示和扁平表示之间自由转换 JSON,而不会丢失任何数据。
JSON 扁平化的工作原理
扁平化算法会递归遍历 JSON 树,在深入嵌套对象和数组的过程中逐步构建路径字符串。
- 递归遍历——算法会遍历对象中的每一个键,并将每个键追加到一个不断增长的、以点号分隔的路径上
- 数组下标表示法——数组元素使用方括号表示法(比如 'items[0].name'),以在扁平化输出中保留其位置
- 叶子收集——当到达某个基本值(字符串、数字、布尔值、null)时,就将完整路径和该值作为一个扁平的键值对存储起来
免费试用 —— 无需注册
扁平化或反扁平化 JSON →何时使用 JSON 扁平化
每当你需要在仅支持扁平结构的系统中处理嵌套数据,或需要比较复杂结构时,扁平化的 JSON 都很有用。
- 数据库存储——无需变更表结构,即可将嵌套的配置或元数据存入扁平的键值表中
- CSV 导出——将嵌套的 JSON 记录转换为扁平行,适合导入电子表格或以表格形式展示
- 配置比较——将两个配置文件扁平化,然后比对扁平后的键,快速找出哪些嵌套值发生了变化
常见问题
扁平化会保留数据类型吗?
会。所有基本值(字符串、数字、布尔值、null)都会被原样保留。数组会变成带下标的路径(比如 'items[0]'),嵌套对象会变成以点号分隔的路径。反扁平化时,会根据这些路径重建出原有的类型。
遇到非常深的嵌套会怎样?
扁平化工具能处理任意深度的嵌套。非常深的对象会产生很长的路径字符串,但在功能上没有限制。如果在意性能,大多数实现会采用迭代方式,以避免在数千层嵌套时出现调用栈问题。
我能扁平化含有重复键的 JSON 吗?
按照规范,JSON 不允许在同一层级出现重复键。如果你的解析器接受重复键,那么每个键只有最后一个值能在解析后保留下来。扁平化工具处理的是解析后的对象,因此在扁平化开始前,重复键就已经被解决了。