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

简介: 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<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


一切恢复正常。

相关文章
|
3月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
53 0
|
1月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
|
2月前
|
vr&ar
MFC序列化及反序列化对象
MFC序列化及反序列化对象
18 0
|
3月前
|
存储 JSON 运维
PowerShell 对象的序列化和反序列化
PowerShell 对象的序列化和反序列化
36 0
|
1月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
存储 Java 数据库
|
3月前
|
Go
golang力扣leetcode 297.二叉树的序列化与反序列化
golang力扣leetcode 297.二叉树的序列化与反序列化
24 0
|
4月前
|
存储 算法
【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS
【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS
25 0
|
3月前
|
存储 算法 C++
leetcode-297:二叉树的序列化与反序列化
leetcode-297:二叉树的序列化与反序列化
22 1
|
13天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
24 5

热门文章

最新文章