一、问题:

  项目里遇到一个需求,规则文件下载后,导入本地解析。

  采用的方案是:获取复杂对象,使用谷歌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转换复杂对象报错【类型强转错误】的更多相关文章

  1. JDK8stream将list转Map对象报错java.lang.IllegalStateException

    ​ JDK8有很多新特性,比如lambda表达式,函数式编程以及stream流的使用,这几个新特性,使用过之后就爱不释手了,比如将list集合通过stream可以直接转换成map对象. 语法: Map ...

  2. SQL 关联外键报错类型不匹配

    如题,关联外键的时候,报错类型匹配.但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UN ...

  3. Table转换成实体、Table转换成实体集合(可转换成对象和值类型)

    /// <summary> /// Table转换成实体 /// </summary> /// <typeparam name="T">< ...

  4. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

  5. oracle dg 报错提示 涉及硬盘错误

    ###oracle dg 报错提示 涉及硬盘错误 Dec 23 03:28:01 xhisdg rsyslogd: [origin software="rsyslogd" swVe ...

  6. django中 自定义User报错 已经注册的错误

    自定义User报错 已经注册的错误 解决方法: unregister后再注册 xadmin.site.unregister(UserProfiles) xadmin.site.register(Use ...

  7. List转换成JSON对象报错(二)

    List转换成JSON对象 1.具体报错如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  8. List转换成JSON对象报错(一)

    List转换成JSON对象 1.具体报错如下 Exception in thread "main" java.lang.NoClassDefFoundError: org/apac ...

  9. JS常见的报错类型

    解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...

随机推荐

  1. mysql root更改远程登录

    mysql> select user,host from mysql.user; +---------------+-------------+ | user | host | +------- ...

  2. Linux系统管理员命令:sudo

    sudo是个统管一切的命令.它的字面意思是代表“超级用户才能做!”(super user do!)对Linux系统管理员或高级用户而言,它是必不可少的最重要的命令之一.你可曾有过这样的经历:在终端中试 ...

  3. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  4. Excel截取特定字符后面的值

    应该用到三个字符串函数:LEFT.RIGHT.MID 1.LEFT函数: 用法:LEFT(要提取字符所在单元格,从左侧开始提取的个数) 例如:=LEFT(A1,2) 意思是从A1单元格提取前两个字符. ...

  5. 17 汽车服务工程 李腾飞 Excel 课程表

  6. 51nod 1275 连续子段的差异

    题目看这里 若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的.我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1). 那么问题就转换成了:在固定i的情况下,如何判断j ...

  7. 解密虚拟 DOM——snabbdom 核心源码解读

    本文源码地址:https://github.com/zhongdeming428/snabbdom 对很多人而言,虚拟 DOM 都是一个很高大上而且远不可及的专有名词,以前我也这么认为,后来在学习 V ...

  8. 扯不清楚的virtual和abstract

    定义Person类: class Person { public void Say() { Console.WriteLine("I am a person"); } } 现在,我 ...

  9. Java阶段性总结与获奖感想

    一.获奖感想 这次能获得小黄衫,可以说是对我自己这半学期以来努力学习的一种肯定,也是激励我继续努力的动力. 首先,我要感谢给予我们耳目一新的学习方式的娄老师.我曾在我期望的师生关系中提到,我的高中班主 ...

  10. 1055. [HAOI2008]玩具取名【区间DP】

    Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替, ...