如何将HashMap存储到SharedPreferences,Gson转JSON返回null怎么解决
根因分析
- 代码中使用双大括号初始化语法创建HashMap,本质是生成了HashMap的匿名内部类实例,Gson默认无法正确序列化匿名内部类,因此返回null。
- 额外需排查的次要诱因:
- Gson版本过低存在已知匿名类序列化Bug
- 循环逻辑执行异常导致userMap实际为空
修复方案
方案1(优先推荐):替换双大括号初始化,使用标准方式创建HashMap
双大括号初始化除了序列化问题外,还会持有外部类引用容易引发内存泄漏,替换为常规写法即可解决问题:
Map<String, String> userMap = new HashMap<>(); for(int i = 0; i < userList.size(); i++ ) { String id= userList.get(i).getId(); String name = userList.get(i).getName(); userMap.put(id, name); } Gson gson = new Gson(); String jsonString = gson.toJson(userMap); // 后续SharedPreferences存储逻辑保持不变 SessionManager sessionManager=new SessionManager(LoginActivity.this); sessionManager.saveMap(jsonString);
方案2:显式指定序列化类型为Map.class
如果需要保留双大括号写法,可在序列化时显式声明序列化类型为Map,让Gson按照Map接口结构处理,忽略匿名内部类的特性:
Gson gson = new Gson(); String jsonString = gson.toJson(userMap, Map.class);
异常排查步骤
如果修改后仍返回null,按以下步骤定位问题:
- 打印userMap的内容确认数据正常:
Log.d("DEBUG", "map内容:" + userMap.toString()); - 打印序列化后字符串确认是否为Gson序列化问题:
Log.d("DEBUG", "序列化结果:" + jsonString); - 检查Gson依赖是否为官方稳定版本,建议升级到2.10.1及以上版本
- 检查SessionManager#saveMap方法逻辑,确认未覆盖入参的jsonString值
内容的提问来源于stack exchange,提问作者Mohamed Aziz Ben haj laroussi
相关产品推荐
相关产品推荐

