用的是fastjson.jar包
1. jsonarray,jsonobject 使用正確代碼如下:(這種getJSONObject 函數形成jsonobj 的方式非常好,可以避免循環引用或jsonobj 后來的覆蓋前面的)
- public JSONArray getJSONArray(){
- JSONArray jsonarray = new JSONArray();
- jsonarray.add(getJsonObj("name", "ar.arch.lcalplay"));
- jsonarray.add(getJsonObj("name", "ar.arch.ticet"));
- jsonarray.add(getJsonObj("name", "ar.arch.hotl"));
- jsonarray.add(getJsonObj("name", "ar.arch.surehotel"));
- return jsonarray;
- }
- public JSONObject getJsonObj(String name, String value) {
- JSONObject jsonobj = new JSONObject();
- jsonobj.put(name,value);
- return jsonobj;
- }
其中使用jsonarray可能出現錯誤,wrong代碼如下:
- JSONArray jsonarray = new JSONArray();
- JSONObject jsonobj = new JSONObject();
- for(int i=0;i<3;i++){
- jsonobj.put("task_id", rs.getString("task_id"));
- jsonobj.put("service_name", rs.getString("service_name"));
- jsonobj.put("thread_num", rs.getString("thread_num"));
- jsonobj.put("delay_time", rs.getString("delay_time"));
- jsonobj.put("last_time", rs.getString("last_time"));
- jsonarray.add(jsonobj);
- }
答疑:其中正確代碼的第三句是重點,每次都要新new出一個對象,不然循環了三次,其實是一直更新一個對象,jsonarray中存的就是最終被修改的jsonobj。
這就是Java中的一切都是引用的原則,jsonarray雖然add的是Object,但是最終add的是引用,所以要add不同對象,就必須每次new一個新的。
讀了源碼,這里jsonarray是用List實現的,故而推廣到List.add(Object)上,也是一樣,每次add,都要新new一個對象再add。
2.servlet 的 doget 方法返回給前端的方法
- doget(){
- //后端給前端推jsonobject或者jsonarray都可以
- response.getWriter().write(JSON.toJSONString(jsonobj));
- response.getWriter().write(JSON.toJSONString(jsonobj));
- }
3. JSON.toJSONString( ) 時會出現 $ref
解決方案是:通過選項 DisableCircularReferenceDetect來禁止循環引用檢測
代碼:
- JSON.toJSONString(jsonarray,SerializerFeature.DisableCircularReferenceDetect)
