如何遍历复杂JSON并原地为所有字符串追加"hello"?
问题解答
可行,但你需要修改字符串所在容器(集合、Map、数组等)中的引用,而非直接修改String本身——因为Java的String是不可变类型,你原代码中value = value + "hello"只是创建了新字符串,但没有把这个新字符串替换回原容器,所以原JSON结构里的内容不会变。
原代码的问题
你的遍历逻辑能找到所有字符串,但处理String时仅修改了局部变量的引用,没有更新它在集合、Map或数组中的原始位置,导致修改无法生效。
修改后的实现
调整遍历逻辑,在找到字符串时,将新字符串替换回对应的容器中:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import java.util.*; public class JsonStringModifier { private final ObjectMapper mapper = new ObjectMapper(); public Object traverseAndAppendHello(Object obj) { if (obj instanceof String) { // 直接返回拼接后的新字符串,由上层容器替换引用 return ((String) obj) + "hello"; } else if (obj instanceof List) { List<Object> list = (List<Object>) obj; for (int i = 0; i < list.size(); i++) { // 替换List中对应位置的元素 list.set(i, traverseAndAppendHello(list.get(i))); } return list; } else if (obj instanceof Map) { Map<Object, Object> map = (Map<Object, Object>) obj; Set<Map.Entry<Object, Object>> entries = new HashSet<>(map.entrySet()); for (Map.Entry<Object, Object> entry : entries) { // 替换Map中对应key的value Object newValue = traverseAndAppendHello(entry.getValue()); map.put(entry.getKey(), newValue); } return map; } else if (obj instanceof Object[]) { Object[] array = (Object[]) obj; for (int i = 0; i < array.length; i++) { // 替换数组中对应位置的元素 array[i] = traverseAndAppendHello(array[i]); } return array; } else if (obj instanceof MyCustomObjectBeingTraversed) { // 将自定义对象转为Map修改,再更新回原对象 Map<String, Object> map = mapper.convertValue(obj, new TypeReference<>() {}); traverseAndAppendHello(map); mapper.updateValue(obj, map); return obj; } // 数字、布尔等其他类型直接返回原对象 return obj; } }
关键说明
- 集合处理:针对List使用
set方法直接替换元素;如果是其他Collection(如Set),可通过迭代器移除旧元素并添加新元素 - Map处理:遍历entrySet,用
put方法替换原value - 数组处理:直接修改数组对应索引的元素引用
- 自定义对象:借助Jackson将对象转为Map修改后,用
updateValue把修改后的内容同步回原对象,无需重建实例
内容的提问来源于stack exchange,提问作者kar
相关产品推荐
相关产品推荐

