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

使用GSON读取List/数组时触发NullPointerException问题

解决GSON解析嵌套List时的NullPointerException问题

我来帮你搞定这个GSON解析时的NullPointerException问题,结合你提供的Analytics类和JSON结构,咱们一步步排查可能的原因,给出对应的解决方案:

一、先检查自定义类的字段映射是否正确

这是最常见的问题之一——你的自定义类字段名和JSON里的字段是否完全匹配?或者有没有用@SerializedName注解做映射?

比如你的UsageStatistics类(就是对应JSON里usage_statistics的自定义类),里面的session_infos字段必须和JSON的键名一致,或者用注解指定。举个正确的类定义示例:

// Analytics类
public class Analytics {
    private String manufacturer;
    private String market_name;
    private String codename;
    private String model;
    private UsageStatistics usage_statistics;

    // 建议加上getter/setter,方便后续访问
    public UsageStatistics getUsage_statistics() {
        return usage_statistics;
    }
}

// UsageStatistics类
public class UsageStatistics {
    // 字段名和JSON的session_infos完全匹配
    private List<SessionInfo> session_infos;

    public List<SessionInfo> getSession_infos() {
        return session_infos;
    }
}

// SessionInfo类
public class SessionInfo {
    private String building_id;
    // 其他对应JSON的字段...
}

如果你的UsageStatistics里用了驼峰命名(比如sessionInfos),那必须加上@SerializedName注解,否则GSON找不到对应的JSON键,会把这个字段设为null:

@SerializedName("session_infos")
private List<SessionInfo> sessionInfos;

二、处理JSON中可能存在的null字段

如果外部返回的JSON里,usage_statistics本身就是null,或者usage_statistics里的session_infos是null,那你直接调用analytics.getUsage_statistics().getSession_infos()时就会触发NPE。

解决办法有两个:

  1. 访问前做null校验:
// 解析JSON
Gson gson = new Gson();
Analytics analytics = gson.fromJson(yourJsonString, Analytics.class);

// 逐层校验,避免空指针
if (analytics != null && analytics.getUsage_statistics() != null) {
    List<SessionInfo> sessionInfos = analytics.getUsage_statistics().getSession_infos();
    if (sessionInfos != null) {
        // 正常处理列表数据
        for (SessionInfo info : sessionInfos) {
            // 你的业务逻辑
        }
    } else {
        // 可以初始化一个空列表,避免后续操作出错
        sessionInfos = new ArrayList<>();
    }
}
  1. 在类中提前初始化列表:
    直接在UsageStatistics类里给session_infos初始化一个空列表,这样即使JSON里没有这个字段或者为null,GSON也不会把它设为null:
public class UsageStatistics {
    private List<SessionInfo> session_infos = new ArrayList<>();
}

三、确认泛型列表的解析方式是否正确

如果你是单独解析session_infos这个列表,一定要用TypeToken来指定泛型类型,不然GSON会把列表解析成List<LinkedTreeMap>,后续操作可能出错或者返回null导致NPE。

错误示例:

// 错误:没有指定泛型类型,解析出来的不是List<SessionInfo>
List<SessionInfo> sessionInfos = gson.fromJson(sessionInfosJson, List.class);

正确示例:

// 使用TypeToken指定泛型类型
Type sessionInfoListType = new TypeToken<List<SessionInfo>>() {}.getType();
List<SessionInfo> sessionInfos = gson.fromJson(sessionInfosJson, sessionInfoListType);

快速定位问题的小技巧

你可以在解析后打印出关键对象的状态,快速判断是哪一层为null:

System.out.println("Analytics对象:" + analytics);
if (analytics != null) {
    System.out.println("usage_statistics是否为null:" + (analytics.getUsage_statistics() == null));
    if (analytics.getUsage_statistics() != null) {
        System.out.println("session_infos是否为null:" + (analytics.getUsage_statistics().getSession_infos() == null));
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:50:33