Gson转换复杂对象报错【类型强转错误】
一、问题:
项目里遇到一个需求,规则文件下载后,导入本地解析。
采用的方案是:获取复杂对象,使用谷歌Gson转换为字串保存为文件下载,客户端读取文件,解析字串,反解对象
遇到的问题:传输的对象是一个嵌套的对象,反解的时候会报出类型强转异常
二、解决:
参考网址:【Gson对象转成Java复杂对象出错】
//规则生成
@RequestMapping(value = {"/getRuleFile"},method = RequestMethod.GET,produces = {"application/json"})
public void getRuleFile(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "orgId",required = false)String orgId){ if(null==orgId || "".equals(orgId)){
orgId = "";
}
List<Rule> ruleList = service.getRuleList(orgId);
//转换为json
String ruleStr = gson.toJson(ruleList);
if("".equals(ruleStr)){
log.error("转换json字串为空!获取的规则信息有:"+ruleList);
}else{
//下载文件
response.setContentType("text/html;charset=gb2312");
response.setHeader("Content-Disposition", "attachment; filename=rule.json");
OutputStream out = null;
ByteArrayInputStream in = null;
try {
out = response.getOutputStream();
in = new ByteArrayInputStream(ruleStr.getBytes());
int len = -1;
byte[] temp = new byte[2048];
while( (len = in.read(temp)) != -1){
out.write(temp,0,len);
}
}catch (Exception e){
log.error("文件下载失败!要下载的文件字串为:"+ruleStr);
e.printStackTrace();
}finally {
try {
in.close();
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} //文件转换
String filePath = "D://temp/rule.json";
String jsonStr = JsonUtils.readCheckFile(filePath);
List<Rule> ruleList = null;
//需要单独使用反射指定转换的对象类型
List<Rule> rules =
new Gson().fromJson(jsonStr, new TypeToken<List<Rule>>() {}.getType());
int i=0;
for(Rule rule : rules) {
System.out.println(rule.getCOLUMNRULES().get(i).getTC_RULE_CODE_VALUES());
i++;
}三、总结:
遇到的这个问题,解决的方法很简单,但是网上的很多方法会误导我们。
找到问题的根源:类型转换时,gson转换的类型和我们期望的类型不匹配,需要反射指定转换的匹配类型
Gson转换复杂对象报错【类型强转错误】的更多相关文章
- JDK8stream将list转Map对象报错java.lang.IllegalStateException
JDK8有很多新特性,比如lambda表达式,函数式编程以及stream流的使用,这几个新特性,使用过之后就爱不释手了,比如将list集合通过stream可以直接转换成map对象. 语法: Map ...
- SQL 关联外键报错类型不匹配
如题,关联外键的时候,报错类型匹配.但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UN ...
- Table转换成实体、Table转换成实体集合(可转换成对象和值类型)
/// <summary> /// Table转换成实体 /// </summary> /// <typeparam name="T">< ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
- oracle dg 报错提示 涉及硬盘错误
###oracle dg 报错提示 涉及硬盘错误 Dec 23 03:28:01 xhisdg rsyslogd: [origin software="rsyslogd" swVe ...
- django中 自定义User报错 已经注册的错误
自定义User报错 已经注册的错误 解决方法: unregister后再注册 xadmin.site.unregister(UserProfiles) xadmin.site.register(Use ...
- List转换成JSON对象报错(二)
List转换成JSON对象 1.具体报错如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...
- List转换成JSON对象报错(一)
List转换成JSON对象 1.具体报错如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...
- JS常见的报错类型
解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...
随机推荐
- ubuntu下配置JDK7环境变量
ubuntu下JDK配置本质上和win是一样的: 1.去官网下载JDK7,找jdk-7u21-linux-i586.tar.gz并下载:http://www.oracle.com/technetwor ...
- [翻译] JKLLockScreenViewController
JKLLockScreenViewController https://github.com/tiny2n/JKLLockScreenViewController Overview It is Loc ...
- Linux 软硬链接详解
软链接 软链接: 类似于windows的快捷方式,—>文本文件,但是包含了真实文件的地址 源文件删除,则软连接也删除 软链接可以放在任何文 ...
- for 与forEach的区别
for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素.在处理比较复杂的处理的时候较为方便. foreach循环 foreach,从头到尾,对于集合中的对象遍历 ...
- Angular总结一:环境搭建
工欲善其事必先利其器,开发 Angular 项目首先要搭建环境.Angular 的环境搭建包括三个方面,开发环境 WebStorm,命令行工具 Angular CLI,以及 nodejs. 一.安装 ...
- React 异步组件
之前写过一篇 Vue 异步组件的文章,最近在做一个简单项目的时候又想用到 React 异步组件,所以简单地了解了一下使用方法,这里做下笔记. 传统的 React 异步组件基本都靠自己实现,自己写一个专 ...
- PostgreSQL学习----模式schema
PostgreSQL学习---模式schema 小序 接触PostgreSQL也有好长时间了,知识不总结梳理,似乎总不是自己的,继续努力吧少年!以此记录我的软件工艺之路! 模式(Schema) 一个 ...
- BZOJ3747:[POI2015]Kinoman(线段树)
Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...
- 有关linqtosql和EF的区别
LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术.他们之间的本质区别在于EF对数据库架构和我们查询的类型实行了更好的解耦.使用EF,我们查询的对象不再 ...
- openstack的网络模式(转)
单节点上虚拟机和虚拟机之间通信 直接同过linuxbridge转发数据,即可通信 虚拟机跨物理节点通信 利用交换机的包转发机制,在大二层网络中转发数据包 虚拟机跟外网通信 同样利用交换机转发,将数据包 ...