JSONObject和Map存储值时的不同

IAM_YXQ 2021-05-08 09:20:38
JSONObject json = new JSONObject();
Map<String, Object> map = new HashMap<>();
List<String> list = new ArrayList<>();

json.put("list",list);
map.put("list",list);

list.add("a");
list.add("b");
list.add("c");

System.out.println("map:");
System.out.println(map);

System.out.println("json:");
System.out.println(json);

输出结果:
map:
{list=[a, b, c]}
json:
{"list":[]}


为什么呢?
...全文
660 点赞 收藏 20
写回复
20 条回复
老王就是我 05月11日
引用 21 楼 IAM_YXQ 的回复:
[quote=引用 20 楼 得一以生 的回复:]提供json转换的第三方工具有很多,大家使用过程中发现问题,没有符合预期一定是他们的实现不一样,要学会看源码,debug一步一步的往下走,遇到方法就进入,最终找到它是如何存储数据的,fastjson使用的就是一个Map<String,Object> 存储数据,并且没有对value做任何复制处理,所以你可以先存入JSONObject里面之后再对对象做添加和修改操作,但是json-lib-2.4-jdk15不一样,它存入数据的时候,像Collection的实现类,比如ArrayList,是转换成自己的JSONArray存储的,所以,后续对ArrayList进行的操作,无法影响JSONArray,因为他们不是同一个对象
我也换了个json类包试了下: 使用com.alibaba.fastjson.JSONObject是有值的; 使用net.sf.json-lib-2.4-jdk15是没有值的; 就是底层代码实现不一样,但是一般都不会去注意这个问题,以后只用alibaba的fastjson了[/quote] fastjson关于时间类型有个bug,而且听说是阿里一个人(对,一个人)开发的,不如选择jackson
回复 点赞
IAM_YXQ 05月10日
引用 20 楼 得一以生 的回复:
提供json转换的第三方工具有很多,大家使用过程中发现问题,没有符合预期一定是他们的实现不一样,要学会看源码,debug一步一步的往下走,遇到方法就进入,最终找到它是如何存储数据的,fastjson使用的就是一个Map<String,Object> 存储数据,并且没有对value做任何复制处理,所以你可以先存入JSONObject里面之后再对对象做添加和修改操作,但是json-lib-2.4-jdk15不一样,它存入数据的时候,像Collection的实现类,比如ArrayList,是转换成自己的JSONArray存储的,所以,后续对ArrayList进行的操作,无法影响JSONArray,因为他们不是同一个对象
我也换了个json类包试了下: 使用com.alibaba.fastjson.JSONObject是有值的; 使用net.sf.json-lib-2.4-jdk15是没有值的; 就是底层代码实现不一样,但是一般都不会去注意这个问题,以后只用alibaba的fastjson了
回复 点赞
得一以生 05月10日
提供json转换的第三方工具有很多,大家使用过程中发现问题,没有符合预期一定是他们的实现不一样,要学会看源码,debug一步一步的往下走,遇到方法就进入,最终找到它是如何存储数据的,fastjson使用的就是一个Map<String,Object> 存储数据,并且没有对value做任何复制处理,所以你可以先存入JSONObject里面之后再对对象做添加和修改操作,但是json-lib-2.4-jdk15不一样,它存入数据的时候,像Collection的实现类,比如ArrayList,是转换成自己的JSONArray存储的,所以,后续对ArrayList进行的操作,无法影响JSONArray,因为他们不是同一个对象
回复 点赞
老王就是我 05月10日
修改list之前已经put进去了,put不会再操作值,这没啥问题吧?
回复 点赞
冰思雨 05月10日
楼主是怎么办到的?我这里存进去了。
回复 点赞
得一以生 05月10日
引用 16 楼 IAM_YXQ 的回复:
[quote=引用 9 楼 得一以生 的回复:][quote=引用 6 楼 IAM_YXQ 的回复:][quote=引用 5 楼 得一以生 的回复:][quote=引用 3 楼 IAM_YXQ 的回复:][quote=引用 1 楼 得一以生 的回复:]你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值[/quote] 你当时输出的时候是不是这两行 System.out.println("json:"); System.out.println(json); 在这三行之前啊 list.add("a"); list.add("b"); list.add("c"); 顺序不能反,否则输出会是[][/quote] 顺序没有反,输出的就是空的,我用的是jdk1.8[/quote] 能发下你的代码里的所有内容吗,包括import导包,以及fastjson版本[/quote] [/quote] 是这样的,json-lib-2.4-jdk15这个json包底层对传入的list最终使用了JSONArray存储的,而且是new了一个JSONArray去接受你传入的list中的所有元素,所以当你传入一个list之后,后续对这个list做的所有操作,不会同步给JSONObject中的JSONArray,所以最终输出的是空集合,你看下源码就知道了,JSONArray.class的764行。 两种修改方案:1、换成阿里巴巴的fastjson包,2、在list塞入json之前就需要给list添加所需的元素。
回复 点赞
IAM_YXQ 05月10日
引用 9 楼 得一以生 的回复:
[quote=引用 6 楼 IAM_YXQ 的回复:][quote=引用 5 楼 得一以生 的回复:][quote=引用 3 楼 IAM_YXQ 的回复:][quote=引用 1 楼 得一以生 的回复:]你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值[/quote] 你当时输出的时候是不是这两行 System.out.println("json:"); System.out.println(json); 在这三行之前啊 list.add("a"); list.add("b"); list.add("c"); 顺序不能反,否则输出会是[][/quote] 顺序没有反,输出的就是空的,我用的是jdk1.8[/quote] 能发下你的代码里的所有内容吗,包括import导包,以及fastjson版本[/quote]
回复 点赞
IAM_YXQ 05月10日
引用 8 楼 七国的天下,我要九十九 的回复:
[quote=引用 7 楼 七国的天下,我要九十九 的回复:]服了, 你把list转入json时, list是空的, 后面在给list添加数据,json当然没有啊.
map里面是引用对象, 对象改变了,内容也会变,但json不一样.[/quote] 我就是想知道为什么不一样呢
回复 点赞
IAM_YXQ 05月10日
引用 10 楼 RockeyCui 的回复:
哪个版本的 json 包? fastjson 1.2.47 jdk1.8 亲测都有值。 感觉你运行的代码和你贴的代码不一样,
回复 点赞
IAM_YXQ 05月08日
引用 5 楼 得一以生 的回复:
[quote=引用 3 楼 IAM_YXQ 的回复:][quote=引用 1 楼 得一以生 的回复:]你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值[/quote] 你当时输出的时候是不是这两行 System.out.println("json:"); System.out.println(json); 在这三行之前啊 list.add("a"); list.add("b"); list.add("c"); 顺序不能反,否则输出会是[][/quote] 顺序没有反,输出的就是空的,我用的是jdk1.8
回复 点赞
得一以生 05月08日
引用 3 楼 IAM_YXQ 的回复:
[quote=引用 1 楼 得一以生 的回复:]你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值[/quote] 你当时输出的时候是不是这两行 System.out.println("json:"); System.out.println(json); 在这三行之前啊 list.add("a"); list.add("b"); list.add("c"); 顺序不能反,否则输出会是[]
回复 点赞
得一以生 05月08日
我复制你的代码,存进去了啊,我的输出是 map: {list=[a, b, c]} json: {"list":["a","b","c"]}
回复 点赞
IAM_YXQ 05月08日
引用 1 楼 得一以生 的回复:
你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值
回复 点赞
得一以生 05月08日
你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
回复 点赞
KeepSayingNo 05月08日
都是存的针对 List<String> list = new ArrayList<>(); 的引用
回复 点赞
得一以生 05月08日
JSONObject json = new JSONObject(); Map<String, Object> map = new HashMap<>(); List<String> list = new ArrayList<>(); json.put("list",list); map.put("list",list); list.add("a"); list.add("b"); list.add("c"); System.out.println("map:"); System.out.println(map); System.out.println("json:"); System.out.println(json); -------------------------------------- 如果你确定是这个代码的话,按理都应该是可以输出的 因为你的集合对象添加元素是在map和json的toString()之前,你可以试一下,楼主
回复 点赞
RockeyCui 05月08日
哪个版本的 json 包?
fastjson 1.2.47 jdk1.8 亲测都有值。
感觉你运行的代码和你贴的代码不一样,
回复 点赞
得一以生 05月08日
引用 6 楼 IAM_YXQ 的回复:
[quote=引用 5 楼 得一以生 的回复:][quote=引用 3 楼 IAM_YXQ 的回复:][quote=引用 1 楼 得一以生 的回复:]你点进去看下HashMap和JSONObject的的toString()方法有什么不同就知道了 控制台输出或者日志输出,如果对象没有重写toString()方法,输出类似这种com.xiaoxiao.test.model.Tom@2e5d6d97,对象的全路径名@hashCode,hashCode为内存地址;如果对象重写了toString()方法,则按照toString()方法输出。
我的意思是为什么json没有存储进去值[/quote] 你当时输出的时候是不是这两行 System.out.println("json:"); System.out.println(json); 在这三行之前啊 list.add("a"); list.add("b"); list.add("c"); 顺序不能反,否则输出会是[][/quote] 顺序没有反,输出的就是空的,我用的是jdk1.8[/quote] 能发下你的代码里的所有内容吗,包括import导包,以及fastjson版本
回复 点赞
引用 7 楼 七国的天下,我要九十九 的回复:
服了, 你把list转入json时, list是空的, 后面在给list添加数据,json当然没有啊.
map里面是引用对象, 对象改变了,内容也会变,但json不一样.
回复 点赞
服了, 你把list转入json时, list是空的, 后面在给list添加数据,json当然没有啊.
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告