问题描述
JSONArray中存放ArrayList后,遍历修改原list中数据时,出现的结果与预期不一致 代码如下:
JSONObject jo = new JSONObject(); List list = new ArrayList<>(); list.add("a "); jo.put("aa",list); JSONArray ja = jo.getJSONArray("aa"); for (int i = 0; i < ja.size(); i++) { ja.set(i,ja.getString(i).trim()); } System.out.println(jo);
期待的正确结果
{"aa":["a"]}
实际输出结果
{"aa":["a "]}
可见并没有trim成功
附加信息
在fastjson1版本中不存在此情况,在其他json版本下也不存在该情况,不知道是bug还是特性。
原提问者GitHub用户xin-zhang-452600
fastjson2里, JSONObject和JSONArray不再是内部维护一个Map和List, 而是继承LinkedHashMap和ArrayList
对于 "aa" => new ArrayList<>(), 在JSONArray ja = jo.getJSONArray("aa"); 实际上过程是获取"aa"得到一个ArrayList, 因为不是JSONArray, 从而创建了一个新的JSONArray 并将"aa"的全部元素放进新的JSONArray
所以后来对JSONArray ja的写操作是不影响JSONObject jo
你可以这样
List list = new JSONArray<>();
或者
ArrayList ja = (ArrayList) jo.get("aa"); for (int i = 0; i < ja.size(); i++) { ja.set(i, ja.get(i).trim()); }
原回答者GitHub用户kraity
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。