JSON反序列化报错LinkedTreeMap,求通用Gson工具类解决方案
解决Gson反序列化出现LinkedTreeMap的问题
嘿,这个问题我之前踩过坑!Gson在处理泛型反序列化时,因为Java的类型擦除机制,经常会把JSON对象默认转成LinkedTreeMap,而不是你期望的实体类,咱们一步步来搞定它。
问题原因拆解
Java泛型是编译时特性,运行时会擦除类型信息。你的通用反序列化方法在运行时没法明确知道要转换成的具体类型,Gson就只能用LinkedTreeMap来兜底映射JSON里的键值对,这就导致了你遇到的类型转换错误。
具体解决方案
1. 用TypeToken指定泛型类型(处理集合/泛型对象)
修改你的GsonUtil,添加一个支持TypeToken的反序列化方法,让Gson能获取到具体的泛型类型:
public class GsonUtil { public static final String FORMAT_DATE = "yyyy-MM-dd HH:mm:ss"; // 假设你的日期格式常量 public static Gson createGsonObject() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(FORMAT_DATE); return builder.create(); // 注意这里要返回创建的Gson对象,之前的代码可能漏了return! } // 新增:支持泛型类型的反序列化方法 public static <T> T fromJson(String json, TypeToken<T> typeToken) { Gson gson = createGsonObject(); return gson.fromJson(json, typeToken.getType()); } }
调用的时候,通过匿名内部类创建TypeToken来保留类型信息:
// 比如反序列化List<User> List<User> userList = GsonUtil.fromJson(jsonResponse, new TypeToken<List<User>>() {}); // 反序列化单个泛型对象(比如Result<User>) Result<User> result = GsonUtil.fromJson(jsonResponse, new TypeToken<Result<User>>() {});
2. 直接传入Class对象(处理单个非泛型实体)
如果只是反序列化普通的实体类(非泛型集合),可以添加一个更简单的重载方法:
// 新增:支持单个实体类的反序列化 public static <T> T fromJson(String json, Class<T> clazz) { Gson gson = createGsonObject(); return gson.fromJson(json, clazz); }
调用示例:
User user = GsonUtil.fromJson(jsonResponse, User.class);
3. 检查Gson对象初始化的小细节
看你原来的代码,builder.setDateFormat(GsonUtil.FORMAT_DATE).create();这里可能没把创建的Gson对象返回,一定要确保createGsonObject方法正确返回初始化后的Gson实例,不然会导致Gson用默认配置,也可能引发奇怪的反序列化问题。
总结
核心思路就是让Gson在反序列化时明确知道目标类型:
- 泛型集合/泛型对象用
TypeToken来保留类型信息 - 普通实体类直接传
Class<T>就够了
这样就能彻底解决LinkedTreeMap的类型转换问题啦!
内容的提问来源于stack exchange,提问作者user6008330
相关产品推荐
相关产品推荐

