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 @   天下没有收费的bug  阅读(656)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示