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

一切恢复正常。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

上一篇中我们进行了散列表的相关练习&#xff0c;在这一篇中我们要学习的是并查集。 目录 概念伪代码选择题填空题编程题7-1 朋友圈R7-1 笛卡尔树R7-2 部落R7-3 秀恩爱分得快 在许多实际应用场景中&#xff0c;我们需要对元素进行分组&#xff0c;并且在这些分组中进行查询和修…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

勒索病毒最新变种._locked勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; _locked勒索病毒&#xff0c;如同黑暗中的毒蛇&#xff0c;突然袭击&#xff0c;将你珍贵的数据缠绕在数字的牢笼中。这种病毒通过电子邮件、恶意链接或经过精心设计的感染途径迅速传播&#xff0c;使你的文件变得无法辨认。而后&#xff0c;犯罪分子以比特币…

YACS(上海计算机学会竞赛平台)一星级题集——回文数的判定

题目描述 给定一个正整数 n&#xff0c;请判定它是否是一个回文数&#xff0c;所谓回文数&#xff0c;就是将这个数的所有数字倒序排列后这个数的大小保持不变&#xff0c;比如 101 与 6886 都是回文数&#xff0c;而 100 不是回文数。 输入格式 单个正整数&#xff1a;表示…

Python 运算符 算数运算符 关系运算符 赋值运算符 逻辑运算 (逻辑运算符的优先级) 位运算 成员运算符 身份运算符 运算符的优先级

1 运算符算数运算符关系运算符赋值运算符逻辑运算逻辑运算符的优先级 位运算布尔运算符移位运算符 成员运算符身份运算符运算符的优先级 运算符 算数运算符 四则运算 - * / a 8 b 9 print(ab)#与Java类似 也可以进行字符串的连接 注意:字符串数字字符串 不存在会抛出异常…

车云TCP链路偶现链接失联问题排查

一、问题分析 1.1 车云tcp长连接分析排查 在15:37:32.039上线&#xff0c; 在 16:07:26.527下线&#xff0c;车云长连接通道稳定&#xff0c;且该期间心跳数据正常。 1.2 云向驾仓推送数据分析 在15:37:42 进行车辆接管后&#xff0c;该车辆下线&#xff0c;且无法在上线&am…

SQL变更评审常见问题分享

SQL变更评审分享 概述 SQL变更&#xff0c;是我们在开发迭代中不可避免的场景&#xff0c;SQL变更通常是指DDL和DML语句变更&#xff0c;这些sql会影响到数据库表结构或具体数据&#xff0c;变更时如果执行到存在问题的sql脚本&#xff0c;会对实际应用操作难以评估的损失&…

[node]node内置模块path

[node]node内置模块path 模块的导入路径值__filename__dirname path 方法path.resolve([from ...], to)path.parse()path.format()path.basename(path[, ext])path.extname(p)path.dirname(p)path.relative(from, to)path.normalize(p)path.isAbsolute(path)path.join([path1][…

css@media媒体查询

Media所有参数汇总 width:浏览器可视宽度。 height:浏览器可视高度。 device-width:设备屏幕的宽度。 device-height:设备屏幕的高度。 orientation:检测设备目前处于横向还是纵向状态。 aspect-ratio:检测浏览器可视宽度和高度的比例。(例如&#xff1a;aspect-ratio:16/9) de…

Java研学-Servlet 基础

一 概述 1 介绍 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成数据&#xff0c;生成动…

会员管理怎么做?

会员管理是企业运营的重要组成部分&#xff0c;它涉及到会员的招募、维护、激励、保留、转化等多个环节。下面&#xff0c;我们将结合具体的案例&#xff0c;详细介绍会员管理的具体做法。 首先&#xff0c;会员的招募是会员管理的第一步 企业需要通过各种方式吸引消费者成为会…

3D数字化系统建设

以3D可视化、数字化技术为基础&#xff0c;其实&#xff0c;很多传统的系统软件都可以重新做一下。 比如&#xff1a;以下这个使用场景&#xff1a;零售门店陈列&#xff1b; 还有&#xff0c;数字化仓储系统&#xff0c;3D数字化供应链系统&#xff0c;3D数字化的生产系统&a…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值&#xff0c;对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

Linux系统基础知识3

现在主要有以下几种Linux系统&#xff1a; Debian Gentoo Ubuntu Damn Vulnerable Linux 红帽企业级Linux CentOS Fedora Kali Linux Arch Linux 以下是以上Linux系统的特点&#xff1a; Debian&#xff1a;稳定性和安全性高&#xff0c;适用于生产环境和服务器等关键应用场景…

基于SpringBoot实现的前后端分离书店项目,功能:注册登录、浏览商品、热门商品、购物车、购买、地址管理、密码管理等

一、项目简介 本项目主要基于SpringBoot、Mybatis-plus、MySQL、Redis实现的书店管理系统。 本系统是前后端分离的&#xff0c;分别由三个子项目构成&#xff1a;java服务端、用户浏览与购买的前端、管理员管理商品的前端 环境 java 1.8mysql8.0redisvue2.x 管理员子系统功…

Ubuntu 常用命令之 ps 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 ps命令是Linux下的一个非常重要的命令&#xff0c;它用于查看系统中的进程状态。ps是Process Status的缩写&#xff0c;可以显示系统中当前运行的进程的状态。 以下是一些常用的参数 a&#xff1a;显示所有进程&#xff08;包括…

textile 语法

1、文字修饰 修饰行内文字 字体样式textile 语法对应的 XHTML 语法实际显示效果加强*strong*<strong>strong</strong>strong强调_emphasis_<em>emphasis</em>emphasis加粗**bold**<b>bold</b>bold斜体__italics__<i>italics</i…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

通过bbeat播放器控制吉他效果器

在这个视频中&#xff0c;我们学习如何使用bbeat播放器来控制Fractal FXIII/FM3吉他效果器切换 有了bbeat&#xff0c;我们就可以播放伴奏和视频&#xff0c;控制 midi 设备&#xff0c;而无需在舞台上携带电脑和声卡。bbeat 可播放音频、midi、视频、图像和多轨文件。 它可读…

单例模式实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.…