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; }
由于我是事先查询出了communicationOptions,所以知道了它的长度。因此在深拷贝之前,可以指定新map的长度。
作者:天下没有收费的bug
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现