jQuery火箭图标返回顶部代码

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

今天遇到一个小问题,我用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的长度。

posted @ 2021-06-07 16:02  天下没有收费的bug  阅读(592)  评论(0编辑  收藏  举报