Gson转换复杂对象报错【类型强转错误】

摘要:
获取的规则信息为:“+ruleList);}else{//下载文件response.setContentType;response.setHeader;OutputStreamout=null;ByteArrayInputStreamin=null;try{out=response.getOutputStream();in=newByteArrayInput Stream;int=-1;byte[]temp=newbyte[2048];while((len=in.read(temp))!=-1){out.write;}捕获{log.error(”文件下载失败!找到问题的根本原因:在类型转换期间,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转换复杂对象报错【类型强转错误】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇yum -y list java* 查看当前java的版本TestLink和RedMine的集成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java Redis读取数据方法

1. public Map<String, List<CellInfo1>>getSceneCoverCellForRedis(){ Jedis jedis = null; Map<String, List<CellInfo1>> cellMap= null;...

gson 生成的json字符串带u003c,u003d,u003e的解决方案(gson将实体类转json)

1.情景展示 如上图所示,使用谷歌的Gson将实体类转json字符串,如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码。 如何解决这个问题? 2.原因分析 错误方式一:使用replaceAll() 错误方式二:使用iso-8859-1解码 3.解决方案 方式一:使用...

JAVA 几款Json library的比较

JSON是JavaScript object notation的缩写,是一种轻量级的描述数据的方式,与XML相比,它更小更快更易解析,此外,JSON还具有跨平台的优势。这下面这篇文章我们将要比较7种Java JSON库,我们将测量做Java和JSON对象的相互转换,存取Json对象到文件的速度。 Jackson Library Jackson是一种“多目的...

JSON和list之间的转换

谷歌的Gson.jar: //list转换为json Gson gson = new Gson(); List<Person> persons = new ArrayList<Person>(); String str = gson.toJson(persons); //json转换为list Gson gson...

GSON实现String和JSON转换

实现JSON字符串转换为JSON对象的方式很多。今天主要说一下最近在项目中用到的一个。觉得很方便。推介给大家 代码: import com.google.gson.Gson;import com.google.gson.JsonObject;public class JsonDemo { public static void main(String[] a...

Gson转换json数据为对象

可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试 { "id": 84041462, "lastName": "小华", "age":32, "balance":666255.32, "hobbyDesc": { "subject": "数学",...