使用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。
解决办法有两个:
- 访问前做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<>(); } }
- 在类中提前初始化列表:
直接在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
相关产品推荐
相关产品推荐

