起因
今天看代碼發現為啥人家寫的代碼沒移除某個元素但是元素不存在了呢?
后來發現代碼在前面獲取了子串移除了某個元素,結果父串也沒有該元素了。
現象
原始JSON字符串是這樣子的:{"a":{"a1":"va1","a2":"va2"}}
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"}}
解釋
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中的子串修改會導致父串相應變化。