标签: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; }
由于我是事先查询出了communicationOptions,所以知道了它的长度。因此在深拷贝之前,可以指定新map的长度。
fastjson反序列化Map对象为null?其实它只是一个地址,试试Map深拷贝
标签:parse 后台 span arc seo image 开始 img 显示
原文地址:https://www.cnblogs.com/LoveBB/p/14859203.html