You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历复杂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;
    }
}

关键说明

  1. 集合处理:针对List使用set方法直接替换元素;如果是其他Collection(如Set),可通过迭代器移除旧元素并添加新元素
  2. Map处理:遍历entrySet,用put方法替换原value
  3. 数组处理:直接修改数组对应索引的元素引用
  4. 自定义对象:借助Jackson将对象转为Map修改后,用updateValue把修改后的内容同步回原对象,无需重建实例

内容的提问来源于stack exchange,提问作者kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:37:42