码迷,mamicode.com
首页 > Web开发 > 详细

fastjson反序列化Map对象为null?其实它只是一个地址,试试Map深拷贝

时间:2021-06-07 21:07:32      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:parse   后台   span   arc   seo   image   开始   img   显示   

今天遇到一个小问题,我用fastjson,把一个map对象转为实体类对象返回给前端的时候,map对象里面的一个属性既然为null。

 

技术图片

 

 

由于前端需求,我们需要返回一个json里面,有两个属性是一样的(都是从数据库查询出来相同的数据),Option和options都是同一个对象。

所以一开始,是只查询一次,然后分别put同一个对象进map里面,结果反序列化的时候,就出现了一个问题,Option是成功显示,optiond却为null。

然后我在后台打印发序列化之前的对象。对比一看

 

技术图片

 

 

技术图片

 

 

可以看出options只是引用了一个地址而已。这个引用地址,在fastjson反序列化的时候,就匹配不上类型,因此结果为null。找到问题之后,然后我尝试new另一个map出来,然后把旧的map用=号赋值过去。但是发现还是一个地址。这就不得不提一下深拷贝和浅拷贝的问题。如果我们想要拷贝一个对象,让它在内存中重新开辟出一个空间,那么就必须用深拷贝。深拷贝的东西这里就不复述太多,毕竟这不是教学博客,相当于是我记录bug的日志吧。

最后附上解决办法

 

技术图片

 

 

技术图片
    public static JSONObject getTableStyleData(ResList<IslandDataPackage> islandDataPackageResList, Map<String, String> communicationOptions) {
        JSONObject styleData = JSONObject.parseObject(tableStyleData.toJSONString());

        styleData.put("total", islandDataPackageResList.getTotal());
        styleData.put("OverviewList", islandDataPackageResList.getData());
        styleData.getJSONObject("ListHeader").getJSONObject("islandId").put("Option", communicationOptions);
        int initSize =(int)(communicationOptions.size()/0.75)+1;
        Map<String, String> copyMap = new HashMap<>(initSize);
        copyMap.putAll(communicationOptions);
        styleData.getJSONObject("searchFormData").getJSONObject("islandId").put("options", copyMap);

        return styleData;
    }
View Code

由于我是事先查询出了communicationOptions,所以知道了它的长度。因此在深拷贝之前,可以指定新map的长度。

fastjson反序列化Map对象为null?其实它只是一个地址,试试Map深拷贝

标签:parse   后台   span   arc   seo   image   开始   img   显示   

原文地址:https://www.cnblogs.com/LoveBB/p/14859203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!