利用阿里的fastjson.jar做java数组转化成json封装数据

利用阿里的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对象引用方面知识。

你操作的只是你那两个对象的引用而已,前面已经有人给出了答案,踩坑之路还很漫长。该给人家采纳就采纳吧。