如何便捷操作Java嵌套List/Map结构,在指定路径下新增属性?
解决方案
方案1:使用Apache Commons JXPath(直接操作原始Java集合对象,无需转JSON)
该库支持用类XPath路径直接读写嵌套的Map、List结构,不需要手动遍历、判断类型,可直接修改原始的嵌套集合对象。
依赖引入
<!-- Maven 依赖 --> <dependency> <groupId>commons-jxpath</groupId> <artifactId>commons-jxpath</artifactId> <version>1.3</version> </dependency>
代码示例
import org.apache.commons.jxpath.JXPathContext; import java.util.HashMap; import java.util.Map; // 你拿到的原始遗留Object参数 Object rawData = 传入的原始参数; // 1. 绑定原始对象创建JXPath上下文 JXPathContext context = JXPathContext.newContext(rawData); // 可选配置:路径不存在时不抛出异常,避免因数据结构波动报错 // context.setLenient(true); // 2. 构造要新增的address2对象 Map<String, String> address2 = new HashMap<>(); address2.put("uvw", "123"); address2.put("xyz", "0815"); // 3. 按指定路径直接赋值,JXPath数组索引默认从1开始,和你给出的路径规则完全匹配 context.setValue("accounting[1]/address/address2", address2); // 此时rawData已经是修改完成的嵌套集合对象,可直接使用
方案2:借助Jackson实现(无额外依赖,适合已引入Jackson的项目)
如果项目已经集成Jackson不需要新增额外依赖,可通过Jackson的JsonPointer能力快速定位修改,最终转回嵌套Map/List结构的Java对象即可。
代码示例
import com.fasterxml.jackson.core.JsonPointer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.Map; ObjectMapper objectMapper = new ObjectMapper(); // 你拿到的原始遗留Object参数 Object rawData = 传入的原始参数; // 1. 将原始对象转换为JsonNode ObjectNode rootNode = objectMapper.valueToTree(rawData); // 2. 用JsonPointer定位目标节点,Jackson数组索引从0开始,accounting[1]对应索引1 ObjectNode addressNode = (ObjectNode) rootNode.at(JsonPointer.compile("/accounting/1/address")); // 3. 新增address2字段 Map<String, String> address2 = Map.of("uvw", "123", "xyz", "0815"); addressNode.set("address2", objectMapper.valueToTree(address2)); // 4. 转回嵌套Map/List结构的Java对象 Object modifiedData = objectMapper.treeToValue(rootNode, Object.class);
两种方案都不需要手动实现遍历、类型判断逻辑,路径规则简单易维护,修改后直接得到可用的Java嵌套集合对象。
内容的提问来源于stack exchange,提问作者asterix
相关产品推荐
相关产品推荐

