使用Unirest解析JSON响应提取eventDefinitionId遇空指针异常
解决Unirest调用REST接口提取嵌套JSON字段的空指针问题
问题分析
触发NullPointerException的核心原因有两个:
- 目标字段
eventDefinitionId并非在JSON根节点,而是嵌套在metadata区域内,直接从根节点actualObj获取会返回null,调用textValue()时触发空指针 - 未处理
eventDefinitionId字段不存在的场景,直接调用方法导致异常中断程序
解决方案
要安全提取嵌套字段并实现"字段不存在则跳过循环"的需求,需做到:
- 逐层遍历嵌套节点:先获取
metadata节点,再从中提取eventDefinitionId - 每一步判空校验:用
JsonNode的has()判断字段是否存在,或用optText()替代textValue()(optText()在字段不存在时返回空字符串而非抛出异常) - 异常分支处理:一旦发现节点为空或字段不存在,用
continue直接进入下一次循环
修改后的代码
//*Enrich Journey Event Info *// Statement stmt_eventId = conn.createStatement(); ResultSet rs_event = stmt_eventId.executeQuery("SELECT JourneyName,definitionid FROM journeydetails"); ObjectMapper mapper = new ObjectMapper(); // 移到循环外,避免重复创建对象 Unirest.setTimeouts(0, 0); // 全局设置一次即可,无需重复执行 while(rs_event.next()){ String JourneyName_For_EventId = rs_event.getString("JourneyName"); JourneyName_For_EventId = JourneyName_For_EventId.replaceAll(" ", "%20"); String Event_URL = "https://xxxxxxx.rest.marketingcloudapis.com/interaction/v1/interactions?name="+JourneyName_For_EventId+"&extras=all"; HttpResponse<String> response_event = Unirest.get(Event_URL) .header("Content-Type", "application/json") .header("Authorization", Token_Auth) .asString(); String jsonString = response_event.getBody(); com.fasterxml.jackson.databind.JsonNode actualObj = mapper.readTree(jsonString); // 第一步:获取metadata节点,判空 com.fasterxml.jackson.databind.JsonNode metadataNode = actualObj.get("metadata"); if(metadataNode == null){ System.out.println("metadata字段不存在,跳过当前记录"); continue; } // 第二步:从metadata中安全获取eventDefinitionId String eventDefinitionId = metadataNode.optText("eventDefinitionId"); if(eventDefinitionId == null || eventDefinitionId.isEmpty()){ System.out.println("eventDefinitionId字段不存在,跳过当前记录"); continue; } System.out.println(eventDefinitionId); // 此处添加后续业务逻辑 }
关键优化点
- 把
ObjectMapper和Unirest全局配置移到循环外,减少不必要的对象创建,提升执行效率 - 对嵌套节点
metadata做判空校验,从源头避免空指针 - 使用
optText()替代textValue(),兼容字段不存在的场景 - 通过
continue实现"跳过当前循环"的需求,保证程序持续执行
内容的提问来源于stack exchange,提问作者Chandrashekhar Dautpure
相关产品推荐
相关产品推荐

