如何从Map中获取peInterface与peSubInterface属性值?
问题解决:从Jackson转换的嵌套Map中提取字段值
问题场景
你用Jackson的ObjectMapper将payload转为Map<String, Object>类型的finmap,代码如下:
ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> finmap = new ObjectMapper().convertValue(payload, Map.class); System.err.println("finmap"+finmap);
finmap输出为:
Output: finmap{orderTaskDryRun=[{dateTime=2023-02-22, dryRunFlag=false, deploymentType=null, peSubInterface=5000, rollbackOutput={}, errorDescription=null, generateOutput={}, errorCode=null, actionCode=Provide, peInterface=TenGigabitEthernet1/0/0, srimsOrderId=585, status=In Progress}]}
尝试直接从finmap根节点取peInterface和peSubInterface时,结果都是null:
String peInterface= null != finmap ? (String)finmap.get("peInterface"):""; String pesubInterface = null != finmap ? (String)finmap.get("pesubInterface"):""; System.err.println("peInterface:" + peInterface); System.err.println("peSubInterface:" + pesubInterface);
问题原因
从finmap的输出可以看出,peInterface和peSubInterface不在finmap的根层级,而是嵌套在orderTaskDryRun对应的List集合的第一个Map元素里。你直接从根Map取值,自然拿不到数据。另外注意字段名大小写:你代码里写的是pesubInterface,但实际字段是peSubInterface,大小写不匹配也会导致取值失败。
解决代码
需要逐层解析嵌套结构,同时做好空指针防护:
String peInterface = ""; String peSubInterface = ""; if (finmap != null) { // 取出orderTaskDryRun对应的List Object orderTaskObj = finmap.get("orderTaskDryRun"); if (orderTaskObj instanceof List) { List<?> orderTaskList = (List<?>) orderTaskObj; // 取List中的第一个元素(输出里只有一个) if (!orderTaskList.isEmpty()) { Object taskObj = orderTaskList.get(0); if (taskObj instanceof Map) { Map<?, ?> taskMap = (Map<?, ?>) taskObj; // 提取peInterface,注意字段名大小写 Object piObj = taskMap.get("peInterface"); if (piObj != null) { peInterface = piObj.toString(); } // 提取peSubInterface,注意字段名和类型(原数据是数字,转String) Object psiObj = taskMap.get("peSubInterface"); if (psiObj != null) { peSubInterface = psiObj.toString(); } } } } } System.err.println("peInterface:" + peInterface); System.err.println("peSubInterface:" + peSubInterface);
额外优化建议
如果频繁处理这类嵌套结构,建议创建对应的Java实体类,用ObjectMapper直接反序列化为实体对象,代码会更简洁易维护,示例如下:
// 定义实体类 class OrderTaskDryRun { private String dateTime; private boolean dryRunFlag; private String deploymentType; private Integer peSubInterface; private Map<String, Object> rollbackOutput; private String errorDescription; private Map<String, Object> generateOutput; private String errorCode; private String actionCode; private String peInterface; private Integer srimsOrderId; private String status; // 生成getter、setter方法 public String getPeInterface() { return peInterface; } public Integer getPeSubInterface() { return peSubInterface; } } // 反序列化并取值 Map<String, List<OrderTaskDryRun>> resultMap = objectMapper.convertValue(payload, new TypeReference<Map<String, List<OrderTaskDryRun>>>() {}); if (resultMap != null && resultMap.containsKey("orderTaskDryRun")) { List<OrderTaskDryRun> taskList = resultMap.get("orderTaskDryRun"); if (!taskList.isEmpty()) { OrderTaskDryRun task = taskList.get(0); peInterface = task.getPeInterface() != null ? task.getPeInterface() : ""; peSubInterface = task.getPeSubInterface() != null ? task.getPeSubInterface().toString() : ""; } }
内容的提问来源于stack exchange,提问作者sneha
相关产品推荐
相关产品推荐

