java中将多级嵌套json转为扁平hashmap的核心是递归遍历,用路径拼接键名(如"user.address.city"),对object递归字段、array按索引展开、原始值直接存入;jackson最常用,需注意数组索引保留、null处理及数字类型差异。

Java 中把多级嵌套 JSON 转成扁平 HashMap,核心思路是递归遍历 JSON 结构,用路径拼接键名(如 "user.address.city"),把每个叶子值存入 HashMap。关键在于正确识别 JSON 对象、数组和原始值,并统一处理键名分隔逻辑。
使用 Jackson + 递归实现扁平化
Jackson 是最常用的 JSON 库,配合 JsonNode 可轻松遍历任意嵌套结构:
- 用
ObjectMapper.readTree(jsonString)得到根节点 - 写一个递归方法,接收当前节点、当前前缀(如
"user")、结果 Map - 对
OBJECT类型:遍历字段,拼接prefix + "." + fieldName继续递归 - 对
ARRAY类型:遍历元素,用索引拼接(如"items.0.name"),避免丢失顺序信息 - 对原始值(STRING / NUMBER / BOOLEAN / NULL):直接 put 到 Map,值类型保持原样(Jackson 默认转为对应 Java 类型)
处理数组时的常见策略
数组不能直接用点号展开,否则会覆盖同名键。推荐两种方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
保留索引:如
"data.list.0.id"、"data.list.1.name"—— 最常用,可逆性强 -
聚合为字符串(慎用):如
"data.list.id=1,2,3"—— 仅适合纯列表且不关心结构的场景,不可逆 - 若数组元素是对象,按索引展开后继续递归,例如
"users.0.profile.age"
用 Gson 或自定义工具类也行,但注意类型擦除
Gson 的 JsonObject 和 JsonArray 同样支持递归遍历,逻辑一致。但要注意:
- Gson 默认把数字全当
Double,整数可能变成123.0,可用JsonElement.getAsInt()等显式取值 - 如果 JSON 含 null 值,Jackson 默认跳过;Gson 会保留
JsonNull,需手动判断并存null或跳过 - 不想引入第三方?可用
org.json库的JSONObject/JSONArray,API 更底层但可控性高
示例:Jackson 扁平化核心代码片段
(省略异常处理和 ObjectMapper 初始化)
public static void flatten(JsonNode node, String prefix, Map<string object> result) {
if (node.isObject()) {
Iterator<map.entry jsonnode>> fields = node.fields();
while (fields.hasNext()) {
Map.Entry<string jsonnode> entry = fields.next();
String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey();
flatten(entry.getValue(), key, result);
}
} else if (node.isArray()) {
for (int i = 0; i
</string></map.entry></string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










