在先後端交互的選擇上,以前一直採用的是模板引擎(由於我只負責後端)。
而此次的一個算是做業吧,先後端都是我,因此就研究了一下JSON交互在java web的應用(主要是前端)。html
先後端耦合前端
數據加載邏輯複用java
後端接口的複用
由於個人學習路線的問題,因此我開發過安卓原生一段時間。jquery
既然選擇了json交互的方式,而java官方據我所知是沒有內置對json的支持,Spring在Controller的層面使用RestContrller註解實現對json的支持。
可是我我的強迫症很強,我對Contrller(或者說是Presenter)的定義是git
正是這兩點的定義,我須要在Service層組合統一格式的結果返回到上層,因此須要第三方json支持。
可選擇的JSON庫有不少,GSON,FastJson,Jackson,根據對比,我選擇爲馬老師充值一波。github
我初步定義的需求主要有三個web
在網上看過不少後端返回數據的格式,不少都是返回一個處理的status以及具體的數據,而這個status是根據http狀態碼進行設定的,由於此次時間比較緊,因此我就採用了這個方案。json
{ "status": "status", "object": { } }
由於我但願Controller能直接拿到結果,因此構建結果的過程全放在Result類中。
而結果構建我主要分爲兩種:只有狀態碼(通知處理結果)以及具備返回結果(數據顯示),而根據結果的我的也分爲兩種:單個數據以及List型數據。後端
@Getter @Slf4j public class ResultSet { private JSONObject result; public ResultSet(){ result=new JSONObject(); } /** * 初始化狀態碼 * @param status */ public void initStatus(String status){ result.put("status", status); } /** * 初始化狀態碼以及返回數據 * @param status * @param obj */ public void initData(String status,Object obj){ initStatus(status); if(obj instanceof List){ List list=(List)obj; JSONArray array=new JSONArray(); for(Object object:list){ array.add(putObjectToJSON(object)); } result.put("object",array); } else { result.put("object",putObjectToJSON(obj)); } } /** * 將單個Object放入json文件中 * @param obj * @return */ private JSONObject putObjectToJSON(Object obj){ JSONObject result=new JSONObject(); Field[] fields=obj.getClass().getDeclaredFields(); for(Field field:fields){ field.setAccessible(true); String fieldName=field.getType().getSimpleName(); if(fieldName.equals("Department")||fieldName.equals("Job")){ JSONObject tempJson=new JSONObject(); try { Object tempObject = field.get(obj); Field[] tempFields=tempObject.getClass().getDeclaredFields(); for(Field tempField:tempFields){ tempField.setAccessible(true); tempJson.put(tempField.getName(),tempField.get(tempObject)); tempField.setAccessible(false); } } catch (IllegalAccessException e) { e.printStackTrace(); } if(fieldName.equals("Department")){ result.put("depart",tempJson); } else { result.put("job",tempJson); } } else { try { result.put(field.getName(),field.get(obj)); } catch (IllegalAccessException e) { e.printStackTrace(); } } field.setAccessible(false); } return result; } }
單個數據以及List數據的處理jsp
嵌套對象的處理
public class Employee { private int id; private Department depart; private Job job; private String name; .................. }
(左爲單object型,右爲List型)
由於此次時間比較趕,從項目的立項到成品的創建花了5天時間,因此注意到不少細節,可是沒有去處理。
有想過以後有時間的話將這個工具類的細節完善起來,造成jar包供本身或者供開源。
這只是後臺對結果的統一處理,我另外寫了一篇文章:JSON工具類的構建(前端版本)),配合使用效果更佳哦~
本文首發於cartoon的博客
轉載請註明出處:https://cartoonyu.github.io/cartoon-blog/post/json/json工具類的構建後端版本/