如何在 Java 中将嵌套对象递归扁平化为键值对映射

小婷君_5026

小婷君_5026

2026-04-29

973人浏览

原创

如何在 Java 中将嵌套对象递归扁平化为键值对映射

本文介绍一种通用、可扩展的 Java 递归扁平化方案,支持 Map、数组、Iterable 和普通 POJO 对象,能将深层嵌套结构(含列表索引)转换为带路径前缀的扁平化 Map。

本文介绍一种通用、可扩展的 java 递归扁平化方案,支持 map、数组、iterable 和普通 pojo 对象,能将深层嵌套结构(含列表索引)转换为带路径前缀的扁平化 `map`。

在处理 JSON 数据或配置对象时,常需将嵌套 Java 对象(如 POJO、Map、List)转换为单层键值结构,便于日志记录、规则匹配、数据库存储或前端透传。例如,将含父子关系与列表字段的对象,转换为形如 "parentClass.childClassList[0].stringField" 的扁平键。

以下是一个健壮、生产就绪的递归扁平化工具方法:

private static Map<string object> convertToFlatMap(String prefix, Object obj, Map<string object> map) {
    if (obj == null) {
        return map;
    }

    // 处理 Map 类型:递归展开 key-value 对
    if (obj instanceof Map) {
        Map, ?> objMap = (Map, ?>) obj;
        objMap.forEach((key, value) -> {
            String fullKey = prefix.isEmpty() ? key.toString() : prefix + "." + key.toString();
            convertToFlatMap(fullKey, value, map);
        });
        return map;
    }

    // 处理数组:按索引生成路径(如 "list[0]")
    if (obj.getClass().isArray()) {
        Object[] array = (Object[]) obj;
        for (int i = 0; i  iterable = (Iterable>) obj;
        int i = 0;
        for (Object item : iterable) {
            String fullKey = prefix + "[" + i + "]";
            convertToFlatMap(fullKey, item, map);
            i++;
        }
        return map;
    }

    // 基础类型(含 String)直接写入
    if (obj.getClass().isPrimitive() || obj instanceof String || obj instanceof Number || obj instanceof Boolean || obj instanceof Character) {
        map.put(prefix, obj);
        return map;
    }

    // 普通 Java 对象(POJO):通过反射遍历所有声明字段
    try {
        for (Field field : obj.getClass().getDeclaredFields()) {
            field.setAccessible(true); // 允许访问 private 字段
            String fullKey = prefix.isEmpty() ? field.getName() : prefix + "." + field.getName();
            Object fieldValue = field.get(obj);
            convertToFlatMap(fullKey, fieldValue, map);
        }
    } catch (IllegalAccessException e) {
        throw new RuntimeException("Failed to access field '" + field.getName() + "' in " + obj.getClass().getSimpleName(), e);
    }
    return map;
}</string></string>

使用方式:

// 假设 yourObject 是对应题干 JSON 结构的 Java 实例(如 Jackson 反序列化后的 Map 或 POJO)
Map<string object> flatMap = convertToFlatMap("", yourObject, new HashMap());
System.out.println(flatMap);
// 输出示例:
// {parentClass.parentField1=parentFieldValue1, parentClass.parentField2=parentFieldValue2, 
//  parentClass.childClass.childField1=childFieldValue1, ...}</string>

✅ 关键特性说明:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • ✅ 支持任意嵌套深度(Map → POJO → List → Map…)
  • ✅ 列表/数组自动编号索引([0], [1]),保留结构位置语义
  • ✅ 兼容 Jackson 反序列化的 LinkedHashMap、ArrayList 等标准容器
  • ✅ 对 POJO 使用反射,无需注解或接口实现
  • ✅ 安全跳过 null 值,避免 NPE

⚠️ 注意事项:

  • 反射访问 private 字段需开启 setAccessible(true),在严格安全策略(如某些容器或模块化 JDK)下可能受限;如需更高兼容性,建议搭配 Lombok @Getter + getters 访问,或改用 Jackson 的 ObjectMapper.convertValue() 配合自定义 SimpleModule。
  • 循环引用(A → B → A)会导致无限递归 —— 生产环境建议增加 ThreadLocal> 缓存已访问对象 ID 进行检测。
  • Iterable 分支对 Set 等无序集合生成的索引不具备语义稳定性,若需确定性输出,应预转为 List。

该方法轻量、零依赖,可无缝集成至工具类库,是 Java 中实现 JSON 式扁平化的高效实践方案。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11417

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8522

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7332

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1456

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3009

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20251

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习