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 ...
随机推荐
- 需要警惕的linux命令
Linux shell/terminal命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除.为了避免这样的事情发生,我们应该时刻注意PHP代码&命令,今天为大家带来9 ...
- Vue2学习笔记:键盘事件
Vue2键盘事件:keydown/keyup... 1.使用 <!DOCTYPE html> <html> <head> <title></tit ...
- Linux 下 python如何配置virtualenv
.安装virtualenv pip3 install virtualenv pip install -i https://pypi.tuna.tsinghua.edu.cn/simple virtua ...
- [翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
USING GIT IN XCODE LOOKING AT HISTORY Xcode provides a Versions editor, which has three different pe ...
- [翻译] ZLHistogramAudioPlot
ZLHistogramAudioPlot A hardware-accelerated audio visualization view using EZAudio, inspired by Audi ...
- 全网数据定时备份方案[cron + rsync]
1.1.1. Rsync(远程同步)介绍 [Rsync等价scp cp rm共3个命令的和] 1.什么是Rsync: Linux下面开源的,很快,功能很多,可以实现全量及增量的本地或者远程数据同步 ...
- Leuze BCL308i 使用方法整理
1 硬件连接关系 1.1 接口盒 BCL308i一般选配MK308/MK348/MK358系列接口盒, 单独使用(不组成扫描集群)时需要连接3根线,分别为SERVICE .SW/PWR.HOST/BU ...
- [T-ARA][For you]
歌词来源:http://music.163.com/#/song?id=33682511 作曲 : Monster Factory [作曲 : Monster Factory] 作词 : Monste ...
- HTML头标签使用-又一次定向,refresh
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 在myeclipse的工作环境上配置默认编码为UTF-8
将默认环境转为UTF-8,看图分析: 在windows->Preferences上 这样整个环境就变成UTF-8,只是这样还不够, 还须要,假设你须要所有文件都设为UTF-8,就: wa ...