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

使用Unirest解析JSON响应提取eventDefinitionId遇空指针异常

解决Unirest调用REST接口提取嵌套JSON字段的空指针问题

问题分析

触发NullPointerException的核心原因有两个:

  • 目标字段eventDefinitionId并非在JSON根节点,而是嵌套在metadata区域内,直接从根节点actualObj获取会返回null,调用textValue()时触发空指针
  • 未处理eventDefinitionId字段不存在的场景,直接调用方法导致异常中断程序

解决方案

要安全提取嵌套字段并实现"字段不存在则跳过循环"的需求,需做到:

  1. 逐层遍历嵌套节点:先获取metadata节点,再从中提取eventDefinitionId
  2. 每一步判空校验:用JsonNode的has()判断字段是否存在,或用optText()替代textValue()(optText()在字段不存在时返回空字符串而非抛出异常)
  3. 异常分支处理:一旦发现节点为空或字段不存在,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:32:58