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

如何通过ObjectMapper修改JSON值?含读取JSON至Map示例代码

解决JSON Map中的值替换问题

嘿,我来帮你搞定这个JSON值替换的事儿!你已经用ObjectMapper把JSON读到Map<String, Object>里,也准备了replaceValues来存要替换的键值对,接下来分两种场景处理:顶层简单键替换和嵌套结构/数组的深层替换,一步步来:

1. 顶层键值替换(比如替换id)

如果只是替换顶层的键(像你已经准备的id→"2"),直接遍历replaceValues,把对应键的值覆盖到jsonMap里就行,代码很直观:

// 遍历替换顶层键值
for (Map.Entry<String, Object> entry : replaceValues.entrySet()) {
    String targetKey = entry.getKey();
    Object newValue = entry.getValue();
    if (jsonMap.containsKey(targetKey)) {
        jsonMap.put(targetKey, newValue);
    }
}

2. 嵌套结构/数组的深层替换

如果需要替换嵌套的字段(比如name.first)或者数组里的元素(比如contact[0].ref),就得写个工具方法来解析路径并定位到目标位置。

步骤1:定义路径格式

把要替换的深层键用点分隔嵌套层级,数组元素用[索引]标记,比如:

  • 替换name下的first:键写为name.first
  • 替换contact数组第0个元素的ref:键写为contact[0].ref

步骤2:写路径解析工具方法

这个方法会根据传入的路径,层层定位到目标字段,然后替换值:

private static void replaceNestedValue(Map<String, Object> rootMap, String path, Object newValue) {
    String[] pathSegments = path.split("\\.");
    Object currentNode = rootMap;

    // 遍历路径的前n-1段,定位到目标字段的父节点
    for (int i = 0; i < pathSegments.length - 1; i++) {
        String segment = pathSegments[i];
        // 处理数组类型的节点
        if (segment.contains("[")) {
            String arrayKey = segment.substring(0, segment.indexOf("["));
            int index = Integer.parseInt(segment.substring(segment.indexOf("[") + 1, segment.indexOf("]")));
            // 假设数组里的元素都是Map类型(匹配你的JSON结构)
            List<Map<String, Object>> targetArray = (List<Map<String, Object>>) ((Map<String, Object>) currentNode).get(arrayKey);
            currentNode = targetArray.get(index);
        } else {
            // 处理嵌套Map类型的节点
            currentNode = ((Map<String, Object>) currentNode).get(segment);
        }
        // 如果路径不存在,直接返回(也可以根据需求抛异常/打日志)
        if (currentNode == null) {
            return;
        }
    }

    // 处理最后一段路径,替换目标值
    String finalSegment = pathSegments[pathSegments.length - 1];
    ((Map<String, Object>) currentNode).put(finalSegment, newValue);
}

步骤3:整合替换逻辑

把顶层替换和深层替换的逻辑结合起来,遍历replaceValues自动判断处理:

// 假设你已经添加了更多替换规则
replaceValues.put("id", "2");
replaceValues.put("name.first", "NewYong");
replaceValues.put("contact[0].ref", "333-333-3333");

// 统一处理所有替换规则
for (Map.Entry<String, Object> entry : replaceValues.entrySet()) {
    String key = entry.getKey();
    Object newValue = entry.getValue();
    if (key.contains(".") || key.contains("[")) {
        // 深层路径,调用工具方法替换
        replaceNestedValue(jsonMap, key, newValue);
    } else {
        // 顶层键,直接替换
        if (jsonMap.containsKey(key)) {
            jsonMap.put(key, newValue);
        }
    }
}

3. 把替换后的Map转回JSON字符串

替换完成后,如果你需要得到更新后的JSON,可以再用ObjectMapper序列化回去:

String updatedJson = mapper.writeValueAsString(jsonMap);
System.out.println(updatedJson);

注意事项

  • 类型一致性:如果需要保持原JSON的类型(比如id原本是Integer,替换后最好还是数字类型),要注意replaceValues里的值类型,比如用2而不是"2"。
  • 路径合法性:如果传入的路径不存在(比如写了name.middle但原JSON里没有这个字段),当前方法会直接跳过,你可以根据需求添加日志或者抛出异常提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:43:31