记一个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()); //这种比较实用,第一种当数据量多的时候会有问题