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


一切恢复正常。

相关文章
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
182 1
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
252 3
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
569 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
175 1
|
6月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
105 1