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


一切恢复正常。

相关文章
|
15天前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
23天前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【8月更文挑战第28天】在Java世界中,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将深入浅出地探讨这一过程,带你领略其背后的原理及应用,让你的程序在数据的海洋中自由航行。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第2天】在Java的世界里,对象序列化和反序列化就像是给数据穿上了一件隐形的斗篷。它们让数据能够轻松地穿梭于不同的系统之间,无论是跨越网络还是存储在磁盘上。本文将揭开这层神秘的面纱,带你领略序列化和反序列化的魔法,并展示如何通过代码示例来施展这一魔法。
18 0
|
2月前
|
存储 安全 Java
揭秘Java序列化神器Serializable:一键解锁对象穿越时空的超能力,你的数据旅行不再受限,震撼登场!
【8月更文挑战第4天】Serializable是Java中的魔术钥匙,开启对象穿越时空的能力。作为序列化的核心,它让复杂对象的复制与传输变得简单。通过实现此接口,对象能被序列化成字节流,实现本地存储或网络传输,再通过反序列化恢复原状。尽管使用方便,但序列化过程耗时且存在安全风险,需谨慎使用。
38 7
|
3月前
|
存储 Java 开发者
Java中的对象序列化详解
Java中的对象序列化详解
|
3月前
|
存储 JSON 数据库
项目管理定义问题之什么是序列化大对象的值对象数据库形态
项目管理定义问题之什么是序列化大对象的值对象数据库形态
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
存储 开发框架 .NET
解锁SqlSugar新境界:利用Serialize.Linq实现Lambda表达式灵活序列化与反序列化,赋能动态数据查询新高度!
【8月更文挑战第3天】随着软件开发复杂度提升,数据查询的灵活性变得至关重要。SqlSugar作为一款轻量级、高性能的.NET ORM框架,简化了数据库操作。但在需要跨服务共享查询逻辑时,直接传递Lambda表达式不可行。这时,Serialize.Linq库大显身手,能将Linq表达式序列化为字符串,实现在不同服务间传输查询逻辑。结合使用SqlSugar和Serialize.Linq,不仅能够保持代码清晰,还能实现复杂的动态查询逻辑,极大地增强了应用程序的灵活性和可扩展性。
97 2
|
6天前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化