如何通过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
相关产品推荐
相关产品推荐

