Gson 是一个用于在 Java 对象和 JSON 数据之间进行序列化和反序列化的开源库。它由 Google 开发并提供支持。Gson 的名称是 “Google JSON” 的缩写。
Gson 提供了简单而强大的 API,可以轻松地将 Java 对象转换为 JSON 字符串,并将 JSON 字符串转换回 Java 对象。它支持复杂的对象图,包括嵌套对象、集合、数组等。
它在许多 Java 应用程序中被广泛使用,尤其是在与 Web 服务的数据交互、持久化和配置文件处理等方面。
今天我们主要聊聊, GSON 泛型对象反序列化遇到的问题。
如下,假如我们有以下泛型对象类:
public class NativeParam<T> { private T data; public NativeParam(T data) { this.data = data; } public T getData() { return data; } public void setData(T data) { this.data = data; } };
public class User { /** * 用户id */ private int userId; /** * 昵称 */ private String nickname; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
通常,序列化和反序列操作 使用 toJson 、fromJson 即可搞定。
如下代码:
Gson gson = new Gson(); User user = new User(); String jsonData = gson.toJson(user); User newUser = gson.fromJson(jsonData,User.class);
可是当我使用泛型时, 抛出了类型转换异常:
Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.test.User
使用代码如下:
Gson gson = new Gson(); NativeParam<User> param = new NativeParam<>(); User user = new User(); user.setUserId(1); user.setNickname("xiaownag"); param.setData(user); String jsonData = gson.toJson(param); NativeParam<User> newParam = gson.fromJson(jsonData, NativeParam.class); User newUser = newParam.getData(); Log.i(TAG,"jsonData:" + String.format("jsonData:%s", jsonData));
尝试使用gson 的 fromJson的重载函数:fromJson(String json, Type typeOfT) 问题得以解决。
代码如下:
Gson gson = new Gson(); User user = new User(); user.setUserId(1); user.setNickname("xiaownag"); param.setData(user); String jsonData = gson.toJson(param); TypeToken<NativeParam<User>> type= new TypeToken<NativeParam<User>>() {}; if (type==null) { return; } NativeParam<User> param = (NativeParam<User>)gson.fromJson(jsonData,type.getType()); if (param == null) { return; } Log.i(TAG, String.format("userId:%d,nickname:%s", param.getUserId(),param.getNickname()));
输出结果:
jsonData:{"code":0,"msg":"成功","data":{"userId":1,"nickname":"xiaownag"}} userId:1, nickname:xiaownag
一切恢复正常。