利用阿里的fastjson.jar做java数组转化成json封装数据
从网上扒的代码,我运行测试已经没有问题了,但是有些地方百思不得其解。
在每一次添加孩子集合hashVP后,为什么r和hash两个全局变量也跟着发生了数据变化,并没有对着两个变量进行add,put等操作啊。
public static JSONArray listToTree(JSONArray arr,String id,String pid,String child){
JSONArray r = new JSONArray();
JSONObject hash = new JSONObject();
//将传入的数组arr转为Object的hash形式
for(int i=0;i<arr.size();i++){
JSONObject json = (JSONObject) arr.get(i);
//hash列表key值为id,value值为一条json
hash.put(json.getString(id), json);
}
//遍历传入的数组arr
for(int j=0;j<arr.size();j++){
//获取单条数组记录aVal
JSONObject aVal = (JSONObject) arr.get(j);
//单条数组aVal的pid在Object列表中是否存在key值所对应的数据
JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString());
//如果存在,则说明这条aVal有父节点,将它添加到孩子节点的集合中
if(hashVP!=null){
/******************************疑问部分*******************************/
检查父节点hashVP是否有child属性。
if(hashVP.get(child)!=null){
//如果存在,获取child列表,追加一条aVal
JSONArray ch = (JSONArray) hashVP.get(child);
ch.add(aVal);
//将child列表重新添加
hashVP.put(child, ch);
}else{
//如果不存在,直接添加child属性
JSONArray ch = new JSONArray();
ch.add(aVal);
hashVP.put(child, ch);//之前少写了一句
/******************************疑问部分*******************************/
}
}else{
r.add(aVal);
}
}
return r;
}
java里,所有的对象都是引用类型。JSONArray JSONObject都是。
JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString()); 从hash这个JSONObject中取出了其中一个元素的引用hashVP,
JSONArray ch = (JSONArray) hashVP.get(child); 又从hashVP中取出了一个引用ch ,
ch.add(aVal); 在ch中add了一个元素,就相当于在hashVP的一个子元素中add了,hashVP里的东西已经改变,hash里的东西也改变了。
至于r,你不是有r.add(aVal);嘛。
还有我觉有你这有段代码写错了吧:
else{
//如果不存在,直接添加child属性
JSONArray ch = new JSONArray();
ch.add(aVal);
/******************************疑问部分*******************************/
}
这段代码执行后完全无效啊,ch是局部变量add了却没有地方用到。{}结束后,ch作为局部变量直接就被清除了,编译器可能根本就不会执行这段代码。
hashVP是从hash里面get出来的,这里应该是获取到hash里面这个对象的引用,你对这个引用hashVP进行操作,相当于就会操作hash,说到底,这两个所指向的就是用一个东西。可以多看看java对象引用方面知识。
你操作的只是你那两个对象的引用而已,前面已经有人给出了答案,踩坑之路还很漫长。该给人家采纳就采纳吧。