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 ...
随机推荐
- LeetCode 题解之Minimum Index Sum of Two Lists
1.题目描述 2.问题分析 直接是用hash table 解决问题 3.代码 vector<string> findRestaurant(vector<string>& ...
- CentOS6.4 下安装 Apache2.4.16
1.准备工作 1.1.yum安装部分工具 1)yum -y install vim 2)yum -y install wget 3)yum -y install gcc 4)yum -y instal ...
- SVN合并时报错:Merge tracking not allowed with missing subtrees; try restoring these items
使用的是TortoiseSVN; Merge tracking not allowed with missing subtrees; try restoring these items 下面会有跟着几 ...
- 安卓 USB摄像头 开源库 UVCCamera 教程
https://github.com/saki4510t/UVCCamera UVCCamera 听名字就知道使用UVC( USB VEDIO CLASS) 协议的通用类库.linux原生支持,基本支 ...
- iOS设计模式 - 访问者
iOS设计模式 - 访问者 原理图 说明 表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 1.Visitor 抽象访问者角色,为该对象结构中具 ...
- 一个好玩的计算题目(c++ 位运算)
2015/11/10 在一个qq群里面,看到一个好玩的题目.“int foo(int x){return x&-x} foo(2^31-3)这个怎么算 ?” 1.自己也就开始算了: (1) ...
- 铁乐学Python_day06-整数和字符串小数据池
python小数据池(内存地址) 今天来学习认识一下python中的小数据池. 我们都知道 ==是用来作比较,要是两个变量的数值相等, 用==比较返回的bool值会是True: a = 1000 b ...
- (转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 材质和光的交互除了反射现象,对于透明物 ...
- Mongo.exe 无法定位程序输入点terminate于动态链接库 *.dll的解决办法
Win7 或者Winserver 上安装新版的Mongo后,总是提示如上问题,可使用如下方法解决: 一是系统更新到SP1,并安装了KB2999226这个更新包(重要): 二是安装安装 Visual C ...
- c++作业之圆面积
代码传送门