原由
今天看代码发现为啥人家写的代码没移除某个元素可是元素不存在了呢?
后来发现代码在前面获取了子串移除了某个元素,结果父串也没有该元素了。json
现象
原始JSON字符串是这样子的:{"a":{"a1":"va1","a2":"va2"}}spa
String jsonString = "{\"a\":{\"a1\":\"va1\",\"a2\":\"va2\"}}"; com.alibaba.fastjson.JSONObject json= com.alibaba.fastjson.JSONObject.parseObject(jsonString); com.alibaba.fastjson.JSONObject aJson = json.getJSONObject("a"); aJson.remove("a1"); System.out.println(json.toJSONString());
你以为上面这段代码输出的结果是怎样的呢?
实际效果是: {"a":{"a2":"va2"}}code
解释
fastjson中的JSONObject使用HashMap或者LinkedHashMap来保存json中的键值对的,getObject(String key)其实就是调用map的get(String key)方法,返回的对象是map中的一个引用对象。
说白了就是下面这个问题:对象
Map<String, List<String>> map = new HashMap<>(); List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); map.put("aa", list); List<String> aaList = map.get("aa"); aaList.remove(0); List<String> aList = map.get("aa"); aList.forEach(System.out::println);
当修改获取到的对象时候,map中的对象也会发生改变,所以fastjson中的JSONObject中的子串修改会致使父串相应变化。rem