
本文介绍一种基于 LinkedHashMap 的递归遍历方案,用于安全、有序地更新任意深度嵌套对象中所有字符串值(如追加后缀),同时严格保留 JSON/Map 的原始键顺序与结构层次。
本文介绍一种基于 `linkedhashmap` 的递归遍历方案,用于安全、有序地更新任意深度嵌套对象中所有字符串值(如追加后缀),同时严格保留 json/map 的原始键顺序与结构层次。
在处理复杂嵌套数据结构(如从 JSON 解析出的 Map
以下是一个健壮、可复用的递归工具方法:
public static Object updateStrings(Object obj, String suffix) {
if (obj == null) {
return null;
}
if (obj instanceof String) {
return ((String) obj) + suffix;
} else if (obj instanceof Object[]) {
Object[] arr = (Object[]) obj;
Object[] updatedArr = new Object[arr.length];
for (int i = 0; i map = (Map<object object>) obj;
Map<object object> updatedMap = new LinkedHashMap();
for (Map.Entry<object object> entry : map.entrySet()) {
// 递归处理 value,key 不变(假设 key 本身无需更新)
updatedMap.put(entry.getKey(), updateStrings(entry.getValue(), suffix));
}
return updatedMap;
} else {
// 基本类型(Integer、Double 等)、自定义对象等直接返回
return obj;
}
}</object></object></object>
使用示例:
// 模拟从 JSON 解析得到的嵌套 Map(已按需保持顺序)
Map<string object> original = new LinkedHashMap();
original.put("name", "name");
original.put("age", 12);
original.put("height", 1.50);
Map<string object> body = new LinkedHashMap();
body.put("detail1", "detail1");
body.put("detail2", "detail2");
body.put("detail3", "detail3");
body.put("detail4", Arrays.asList("detail4", ""));
original.put("body", body);
original.put("arr", Arrays.asList(1, 2, 3));
original.put("arr2", Arrays.asList("", "", ""));
Map<string object> bod2 = new LinkedHashMap();
Map<string object> child = new LinkedHashMap();
child.put("name", "a");
child.put("name2", "b");
bod2.put("child", child);
original.put("bod2", bod2);
// 执行更新
Object result = updateStrings(original, " Hello");
System.out.println(new ObjectMapper().writeValueAsString(result));</string></string></string></string>
关键要点说明:
- ✅ 顺序保障:所有 Map 分支均使用 LinkedHashMap 替代 HashMap,确保键的遍历与插入顺序完全一致;
- ✅ 类型安全:明确区分 String、数组、Map 和其他类型,避免误操作(如对数字追加字符串);
- ✅ 空值防御:增加 obj == null 判断,防止 NPE;
- ⚠️ 注意点:该方法生成新对象而非原地修改——这是函数式设计的最佳实践,既保证线程安全,又避免意外污染源数据;若需极致内存优化,可考虑基于 Jackson 的 JsonNode 遍历,但会牺牲通用性;
- ? 扩展性:通过 suffix 参数支持任意后缀,亦可轻松改为前缀、条件替换(如仅非空字符串才处理)等逻辑。
最终,你将获得一个结构完整、顺序精确、字符串全部更新的新对象,完美适配配置增强、日志注入、模板预处理等典型场景。










