记一个fastJson使用JSONArray深拷贝浅拷贝问题

     voList.stream().forEach(mergeCellVo->{
Integer cellIndex = mergeCellVo.getCellIndex();
          //注意这里mergeCellVo是一个dto 遍历volist时cellJson引用该dto
JSONObject cellJson = mergeCellVo.getCellJson();
JSONArray rows = tableObj.getJSONArray("rows");
if (rows.size() < 2) {
return;
}
//table第三行开始
for (int g = 2; g < cellNum +2 ; g++) {
JSONArray row = rows.getJSONArray(g);
for(int k=0;k<row.size();k++){
if(k== cellIndex){
                 //这里进行深拷贝
                 JSONObject cellJsonNew = JSON.parseObject(cellJson.toJSONString());
                         //   JSONObject cellNewJson=new JSONObject();
// cellNewJson.putAll(cellJsonNew);
                 //这里之前直接存的cellJson导致了浅拷贝问题,
row.add(k,cellNewJson);
}
}
}
});
后期处理row这个JSONArray的时候会发现只要其中的cellJson改变会导致整个JSONArray中的该对象都改变
 且数组拷贝出来变成这个样子,变成了引用格式而不是数值格式

一个add方法为什么会造成浅拷贝的问题,源码中如下:

        final修饰的,对象值可变引用不可变!!!!!!!!!!  解决方法有几种目前用的是:

   1.JSONObject cellNewJson=new JSONObject();              cellNewJson.putAll(cellJson);
  2.JSON.parseObject(cellJson.toJSONString()); //这种比较实用,第一种当数据量多的时候会有问题
posted @ 2022-06-08 10:26  悄悄地超越  阅读(950)  评论(0编辑  收藏  举报