qq_35908963
2019-03-12 23:29
采纳率: 66.7%
浏览 1.8k

利用阿里的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;
        }
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • qq_18727699 2019-03-13 09:38
    已采纳

    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作为局部变量直接就被清除了,编译器可能根本就不会执行这段代码。

    打赏 评论
  • devmiao 2019-03-13 00:02
    打赏 评论
  • TinerSky 2019-03-13 09:07

    hashVP是从hash里面get出来的,这里应该是获取到hash里面这个对象的引用,你对这个引用hashVP进行操作,相当于就会操作hash,说到底,这两个所指向的就是用一个东西。可以多看看java对象引用方面知识。

    打赏 评论
  • 夏南南 2019-03-14 08:55

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

    打赏 评论

相关推荐 更多相似问题