json对象扁平化是将嵌套结构转为单层键值对,用点号连接路径作为键名;展开则是其逆操作,按点号分割路径逐层构建嵌套对象。

JSON 对象扁平化:把嵌套结构转成一层键值对
扁平化是指将多层嵌套的 JSON 对象(如含对象、数组)转换为单层结构,通常用点号(.)连接路径作为新键名。关键在于递归遍历,遇到对象或数组就继续深入,遇到基础类型(字符串、数字、布尔、null)就写入结果。
示例:
{
"user": {
"name": "Alice",
"profile": {
"age": 30,
"tags": ["dev", "js"]
}
},
"active": true
}
扁平化后变成:
{
"user.name": "Alice",
"user.profile.age": 30,
"user.profile.tags": ["dev", "js"],
"active": true
}
注意:数组一般不拆开元素索引(如不生成 user.profile.tags.0),除非明确需要;若需展开数组项,需额外处理逻辑。
简单实现(忽略数组索引展开):
function flatten(obj, prefix = '', result = {}) {
for (let key in obj) {
if (!obj.hasOwnProperty(key)) continue;
const value = obj[key];
const newKey = prefix ? `${prefix}.${key}` : key;
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
flatten(value, newKey, result);
} else {
result[newKey] = value;
}
}
return result;
}
JSON 对象展开:从扁平结构还原为嵌套对象
展开是扁平化的逆操作,把 a.b.c: 123 这类键还原成 {a: {b: {c: 123}}}。核心是按点号分割路径,逐层创建对象,最后赋值。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
常见陷阱:同一路径前缀多次出现(如 a.b: 1 和 a.c: 2),需确保中间层级被复用而非覆盖。
安全展开实现:
function unflatten(obj) {
const result = {};
for (let key in obj) {
const parts = key.split('.');
let cursor = result;
for (let i = 0; i <h3>数组在扁平化/展开中的特殊处理</h3><p>默认扁平化会把整个数组当一个值保留(如 <strong>list: [1,2,3]</strong> → <strong>list: [1,2,3]</strong>),但有时需要“展开数组项”,例如生成 <strong>list.0: 1</strong>、<strong>list.1: 2</strong>。</p><p>若需支持数组索引展开,修改扁平化函数:</p>
- 遇到数组时,遍历每个索引,用 ${prefix}[${i}] 或 ${prefix}.${i} 作为新键(推荐后者,兼容点号解析)
- 展开时识别数字键名(如 arr.0),自动创建数组并用 parseInt 转索引
- 注意混合场景:同个前缀下既有 arr.0 又有 arr.length,需避免把对象误判为数组
实际使用建议
浏览器和 Node.js 原生不提供 flatten/unflatten 方法,需自行封装或借助库(如 flat、nestify)。但多数场景下,手写轻量函数更可控。
注意事项:
- 键名含点号或方括号时(如 "user.name" 字符串本身),扁平化会出错,应避免或预处理转义
- 循环引用对象会导致无限递归,生产环境需加访问标记检测
- JSON 标准不支持 undefined、函数、Date 等,扁平前建议先用 JSON.stringify 验证可序列化性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










