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

Java使用Jackson的JsonNode解析嵌套JSON时出现NullPointerException

问题原因及解决方法

问题根源

Google Books API的响应结构和你的解析逻辑不匹配:

  • API返回的根节点并不直接包含title字段,title实际嵌套在items数组中每个元素的volumeInfo对象下
  • 你直接调用volumeNode.get("title"),由于根节点没有这个键,返回null,后续调用textValue()就触发了空指针异常

解决步骤

1. 修正JSON解析路径

先定位到正确的嵌套节点,修改后的示例代码如下:

ObjectMapper mapper = new ObjectMapper();

URL url= new URL(setURL(bookInfo, infoType));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream responseStream = connection.getInputStream();

JsonNode rootNode = mapper.readTree(responseStream);
GoogleVolume testVolume= new GoogleVolume();

// 1. 获取items数组(API返回多结果时的顶层结构)
JsonNode itemsNode = rootNode.get("items");
if (itemsNode != null && itemsNode.isArray() && itemsNode.size() > 0) {
    // 2. 取第一个结果(如需处理多结果,可循环遍历itemsNode)
    JsonNode firstItem = itemsNode.get(0);
    // 3. 获取volumeInfo节点
    JsonNode volumeInfoNode = firstItem.get("volumeInfo");
    if (volumeInfoNode != null) {
        // 4. 从volumeInfo中提取title
        JsonNode titleNode = volumeInfoNode.get("title");
        if (titleNode != null) {
            testVolume.setTitle(titleNode.textValue());
        }
    }
}

2. 更优雅的方式:直接映射到实体类

定义对应API结构的实体类,让Jackson自动完成映射,避免手动解析的繁琐:

// 顶层响应实体
public class GoogleBooksResponse {
    private List<GoogleBookItem> items;
    // 生成getter、setter方法
}

// 单个图书项实体
public class GoogleBookItem {
    private GoogleVolumeInfo volumeInfo;
    // 生成getter、setter方法
}

// 图书信息实体(可根据需求调整字段)
public class GoogleVolumeInfo {
    private String title;
    // 其他需要的字段,比如authors、publisher等
    // 生成getter、setter方法
}

解析代码可简化为:

ObjectMapper mapper = new ObjectMapper();

URL url= new URL(setURL(bookInfo, infoType));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream responseStream = connection.getInputStream();

GoogleBooksResponse response = mapper.readValue(responseStream, GoogleBooksResponse.class);
if (response.getItems() != null && !response.getItems().isEmpty()) {
    GoogleVolumeInfo volumeInfo = response.getItems().get(0).getVolumeInfo();
    if (volumeInfo != null) {
        testVolume.setTitle(volumeInfo.getTitle());
    }
}

3. 额外建议

  • 处理API响应时必须添加空值判断,避免因API返回空数组、缺失字段导致的异常
  • 调试时可先将响应流转为字符串打印,确认字段路径:
    String responseStr = new String(responseStream.readAllBytes(), StandardCharsets.UTF_8);
    System.out.println(responseStr);
    

内容的提问来源于stack exchange,提问作者TeaDrinker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23