利用阿里的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个回答

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

qq_18727699
qq_18727699 回复qq_35908963: 捋了一遍你的算法逻辑,不知道我想的对不对:既然是要转化成树,那么至少有一个根节点(如果是多个树还有可能有多个根节点)是没有父节点的吧,我猜通常你会把它放在arr的第一个元素。遇到没有父节点的元素,你的hashVP就==null了,可能一开始就把根节点放到r里去了;然后,第二个元素来了,很有可能它就是根节点的直接子节点,那么你的hashVP是取第二个元素的父节点,结果就是你刚刚add到r里去的那个根节点!然后你给这个根节点的child的数组add了,就是给r里的第一个元素的child add了嘛,所以r里的东西整个都在随着你循环的进行而变化。再仔细想一想。然后整颗树就这样构建起来了。
6 个月之前 回复
qq_35908963
qq_35908963 嗯嗯,我之前少写了一行,但是那个r.add(aVal)应该只有在hashVP==null的时候才执行啊。
6 个月之前 回复

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
阿里fastjson.jar
fastjson.jar 支持大量的json 数据转换,速度快。用法简单,解压之后即可使用
阿里的fastJson.jar
阿里的fastJson.jar,用起来感觉还是不错的,方便,快捷,用法可以参考我的博客http://blog.csdn.net/weixin_33446857/article/details/79171122
利用json封装数据
json JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率(百度百科) json语...
谷歌的Gson.jar和阿里的fastJson.jar
谷歌的Gson.jar和阿里的fastJson.jar
阿里fastjson.jar使用
public static final Object parse(String text); //把JSON文本parse为JSONObject或者JSONArray     public static final JSONObject parseObject(String text); //把JSON文本parse成JSONObject   public static final  T
阿里巴巴json解析 fastjson.jar
阿里巴巴旗下json工具类 fastjson 支付宝支付sdk 阿里巴巴旗下json工具类 fastjson 支付宝支付sdk
使用json值的数组封装数据 html 源代码
json的简单应用 使用json值的数组封装数据 html 源代码 一个增加删除查询的简单例子
JSON封装数据与取值
不依赖任何包,封装json数据,并到页面取值!特别适合异步!
返回json封装数据
/** * 返回json封装 * @author * 2017年8月30日 * @param &lt;T&gt; */ public class ResponseResult&lt;T&gt; { /** * 状态码 */ private int code; /** * 返回信息 */ private String...
fastjson.jar
fastjson.jar 阿里巴巴的工具类,用于json解析,转化等等
java 数组转化成集合
将数组转换成集合,数组必须是引用数据类型,如果基本数据类型的数组转换成集合,会将整个数组当作一个对象转换  public static void main(String[] args) { //基本数据类型的数组转换成集合,会将整个数组当作一个对象转换 //输出:[[I@2a139a55] int[] arr = { 11, 22, 33, 44, 55 }; List...
使用json封装数据 html源代码
json的简单应用 使用json封装数据 html源代码 一个增加删除数据的例子
利用 fastjson.jar 把对象解析成Json 数据
为了直观,直接写了一个简单的 Java Demo测试一下1.先写一个实体类import java.io.Serializable; public class TestClass implements Serializable { /** * */ private static final long serialVersionUID = 90012823180176
C++ 使用Json封装数据和解析数据
使用C++和别的语言做交互比较常用的一种数据操作方式就是json。可以到GitHub上下载对应C++的json库源码,我自己下了一套之前的版本,可以正常使用。jsoncpp-src 编译出来的库名:json_vc71_libmtd.lib(debug) | json_vc71_libmt.lib(release) 需要包含的头文件: jsoncpp-src(对应源码)/include/json (
用阿里的fastJson.jar进行json数据与list互转
//list转换为jsonList&amp;lt;CustPhone&amp;gt; list = new ArrayList&amp;lt;CustPhone&amp;gt;();String str=JSON.toJSON(list).toString();    1    2    3//json转换为list  List&amp;lt;Person&amp;gt; list = new ArrayList&amp;lt;Person&amp;gt;()...
Swift-字典数组转化成JSON -本人亲测
在开发过程中,某中情况下,服务器的同事会要求我们把数据写成JSON的格式发送给后台。 数组里面有嵌套字典的情况,举个例子: [{"brand_id":"28","number":"1","class_id":"2"},{"brand_id":"62","number":"1","class_id":"60"}] 这个时候就需要数据的转化。 首先转化成NSData类型。然
利用Gson把json转化成Java List异常问题
Java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ….. 我需要把一串json转化成Java List 最初是这样写的: private List mList = new ArrayList(); Gson gson=new Gson(); mList=
利用JSON做对象适配
使用JSON依赖包: jackson-annotations jackson-core jackson-databind 场景描述: 由于双方数据定义的名称不一样而导致的数据适配问题。 先定义FromEntity,当然了这个对象也可能是String类型的字符串,没关系: public class FromEntity { private int stu_id
java 将数组转化成List
今天看了一个东东, 将数组转化成List,我当时只想到一种Collections.add(); 我想看看有没有其他方法,就百度了一下,结果,我很欣喜啊。。。 给你们看看有几种方式吧 这个问题是”在Java中怎样把数组转换为ArrayList?” 1 Element[] array = {new Element(1),new El
封装数据
在许多语言系统中,封装数据是由语法解析来实现的,这些语言还提供了关键字private,public,protected等关键字来提供不同的访问权限.但是javascript并没有提供这些关键字的支持,我们只能依赖变量的作用域来实现封装的特性,而且只能模拟出public 和private这两种封装性除了es6 提供的 let 和const 之外, 一般我们通过函数来创建作用域var myObject...
数组字符串转化成数组
const str = '["a", "b", "c"]' const arr = eval(str ); console.log(arr) //["a", "b", "c"] 简介 eval() eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 语法:eval(string) 返回值:通过计算 string 得到的值(如果有的话)。 该方法只接受原始...
APP接口(2)json封装数据方法
使用json去封装数据呢,主要是用到了一个函数json_encode(),这个是很重要的   iconvc()这个函数主要有三个参数,第一个是原始编码,第二个是转换之后的编码,第三个就是传过来的变量名。   还有一个需要注意的是通信数据标准格式        code:状态码(服务器端的状态)        message:提示的信息        data:返回
NSString 转化成 JSON 字符串
I needed a quick way to encode an NSString to be used in a JSON object in an iPhone project. There are libraries to do this like TouchJSON, but I didn’t want to link a whole library to insert a stri
json转化成url参数
var json = { sh: '上海' } var params = Object.keys(json).map(function (key) { // body... return encodeURIComponent(key) + &quot;=&quot; + encodeURIComponent(json[key]); }).join(&quot;&amp;amp;&quot;);   得到的params就是...
关于json转化成集合
JSONArray ja = new JSONArray(result);rn JSONObject jb = (JSONObject)ja.get(i);rn jb怎么转成List>类型啊rn 因为我想要把jb放到SimpleAdapter里面
json转化成16进制
json如何转化成16进制啊,请明白的大神指导一下。
将枚举类型,转化成json
通过反射机制,将枚举类型转化为json. public static String toJson(Enum[] enumValues) throws IllegalAccessException, InvocationTargetException { StringBuffer buffer=new StringBuffer("["); b
SHP转化成JSON
1、首先在ArcMap中,将安徽省各城市及区县图层制作好,之后发布地图服务。 2、打开http://localhost:6080/arcgis/rest/services。选择自己发布的专题图。 打开自己发布的专题图之后,弹出以下对话框。之后选的不同的图层。 选择图层之后将弹出得页面拖到最下方找到Query 填写相应的属性信息,然后点击Query(GET)。 获取相应...
Java将xml转化成json案例
xml格式如下:&amp;lt;plist version=&quot;1.0&quot;&amp;gt; &amp;lt;array&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;cities&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;areas&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &am
阿里json包 fastjson-1.2.3.jar
FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象
阿里json包
FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象 --------------------- 作者:superlovelei 来源:CSDN 原文:https://blog.csdn.net/superlover_/article/details/79741075 版权声明:本文为博主原创文章,转载请附上博文链接!
阿里Json解析
1 对象转字符串: String ss=JSON.toJSONString(对象);2 字符转对象 对象 tt = JSON.parseObject(json, 对象.class)FR:徐海涛(hunk Xu)
阿里和谷歌的json的jar包
google 的 json工具包, 实现json字符串与javabean之间的互转 阿里的的 json工具包, 实现json字符串与javabean之间的互转
Java JSON 之 数组 转 JSON 字符串
http://www.verejava.com/?id=16998590966648下载依赖 jar 包 json.jar package com.json8; import org.json.JSONArray; import org.json.JSONException; public class Test { public static void main(String[...
利用Json表示Java对象(附利用sublime插件格式化json)
为了使序列化和反序列化变得易于理解,人们提出了使用 Json,XML,Yaml等格式的文本表示对象。 今天,笔者尝试利用JSON来表示Java对象package com.test; import org.json.*; public class AccountJsonTest { public static void main(String[] args) throws
Java 解析 Json 文件 (把 Json 转化成 String 的方法来解析)
Java 解析 json
java利用json-lib操作json
java利用json-lib操作json
利用Java做全文检索
项目上需要做全文检索,数据源是word,excel等一些非结构化数据,放在服务器上的指定目录下。如何用Java实现全文检索,要求能搜文件名及文件内容。不需要象搜索引擎一样智能,不需要切词。效果类似于数据库的like语句即可。rnrn需要思路,以及具体的代码,要开源的喔。
相关热词 c#检测非法字符 c#双屏截图 c#中怎么关闭线程 c# 显示服务器上的图片 api嵌入窗口 c# c# 控制网页 c# encrypt c#微信网页版登录 c# login 居中 c# 考试软件