GSON 泛型对象反序列化解决方案


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<Mode>)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

一切恢复正常。


相关推荐

  1. GSON 对象序列解决方案

    2023-12-22 20:14:02       42 阅读
  2. Flutter-如何序列序列化为json对象

    2023-12-22 20:14:02       16 阅读
  3. 1.射,

    2023-12-22 20:14:02       37 阅读
  4. RabbitMQ传递序列/序列自定义对象时踩坑

    2023-12-22 20:14:02       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 20:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 20:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 20:14:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 20:14:02       20 阅读

热门阅读

  1. k8s中Chart模板流程控制if_with_range和变量

    2023-12-22 20:14:02       40 阅读
  2. Watchdogs

    Watchdogs

    2023-12-22 20:14:02      35 阅读
  3. 基于K-means和形态学算法的叶子病虫害检测

    2023-12-22 20:14:02       40 阅读
  4. 基于FSRCNN的图像超分辨重建算法附Matlab代码

    2023-12-22 20:14:02       38 阅读
  5. [蓝桥杯 2013 省 AB] 错误票据

    2023-12-22 20:14:02       34 阅读
  6. P2P应用

    P2P应用

    2023-12-22 20:14:02      46 阅读
  7. elementui下选框获取后端数据并查询

    2023-12-22 20:14:02       39 阅读
  8. React尝鲜

    2023-12-22 20:14:02       41 阅读
  9. k8s pod常用资源清单

    2023-12-22 20:14:02       30 阅读
  10. spark中 write.csv时, 添加第一行的标题title

    2023-12-22 20:14:02       44 阅读
  11. 力扣面试经典题之数组/字符串

    2023-12-22 20:14:02       46 阅读
  12. libp2p服务发现之 Multicast DNS(mDNS)

    2023-12-22 20:14:02       32 阅读