Java Web程式實現返回JSON字串的方法總結_java

來源:互聯網
上載者:User

基礎鋪墊
在java中,關於json的lib有很多,比如jackjson、fastjson、gson等等,本人都用過,但是對於我等只需要讓java對象返回json字串即可的程式員來說,還是顯得過於繁重。而且有些功能定製性很差,比如一個java對象的屬性為空白時,這些組件都不會輸出,於是本人在頁面迴圈遍曆列表對象時,總是得判斷此屬性是否為undefined,這一點讓本人很不滿意。所以決定花點時間研究下到底是怎麼回事。

但經過一上午的細看,發現不管是fastjson還是gson都代碼都寫得相當的複雜,又沒什麼相關的文檔與注釋,最後放棄了。於是自己又在www.json.com上找到了相對很簡單的返回json的java包,這個lib只需要5個java類即可運行,正合我意。需要注意的是,官方的JSONArray這個東西並不支援javabean的直接轉換,比如List<User>這樣的東西是不能轉換的,必須要把它轉換成List<Map>這樣的格式,才能轉換,所以我對它進行了改造。官方的檔案有:

先介紹下基本用法。

處理基本的java對象使用JSONObject類,用法大體如下:

public void testMap(){    Map<String,Object> map = new HashMap<String,Object>();    map.put("name", "qiu");    map.put("password", "123");    map.put("address", "china");        User user = new User();    user.setUserName("qiuqiu");    user.setPassword("123456");    user.getTels().add("1234444556677");    user.getTels().add("6893493458585");        map.put("user", user);        JSONObject json = new JSONObject(map);    System.out.println(json.toString());  }

如果是collection對象,則採用JSONArray類,用法如下:

public void testList() throws JSONException{    List<User> list = new ArrayList<User>();        User user = new User();    user.setUserName("qiuqiu");    user.setPassword("123456");    user.getTels().add("1234444556677");    user.getTels().add("6893493458585");        User user2 = new User();    user2.setUserName("中國");    user2.getTels().add("1234444556677");    user2.getTels().add("6893493458585");        list.add(user);    list.add(user2);        JSONArray json = new JSONArray(list);        System.out.println(json.toString(2));  }

由上面的代碼可以看出,這個lib的用法相當的簡單,不像什麼gson之類得新建立個對象,fastjson的API設計也有些不合理。上面的第二段代碼中,有個toString(2)表示按換行縮排兩個空格的方式輸出。
上面只是介紹了基本用法,但這並不是自己想要的,自己想要的是怎麼讓對象屬性為空白時返回一個Null 字元串,而不是什麼都不返回。雖然只有5個類,但本人還是花了兩三個小時的才找到地方,在JSONObject中有個叫populateMap的方法,在最後有小段代碼:

Object result = method.invoke(bean, (Object[])null); if (result != null) {   this.map.put(key, wrap(result)); }

 即當調用get方法返回為null時,就不輸出此屬性。當然改起來就很簡單了:

Object result = method.invoke(bean, (Object[])null);this.map.put(key, result==null?"":wrap(result));

這樣總算解決了本人想要解決的問題。當然這個lib是json官方內建的,寫得相當的簡單,比較適合一次資料只有幾條或者幾十條的情況,如分頁顯示等。如果一次傳輸資料量比較大的話,可以考慮使用fastjson等。但個人覺得對於大多數場合來說,最需要的是可定製性。比如偶爾發現個某組件不能滿足的需要,結果此組件即無文檔也無注釋,代碼又比較難理解,基本上跟沒開源差不多,那就沒什麼意義了。

執行個體總結

import java.io.IOException; import java.io.PrintWriter;  import javax.servlet.http.HttpServletResponse;  import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature;  /**  *  * Web服務端返回JSON工具類  * 工具類依賴FastJSON  * 工具類支援返回JSON和JSONP格式資料  * @author accountwcx@qq.com  *  */ public class ResponseJsonUtils {   /**    * 預設字元編碼    */   private static String encoding = "UTF-8";      /**    * JSONP預設的回呼函數    */   private static String callback = "callback";      /**    * FastJSON的序列化設定    */   private static SerializerFeature[] features = new SerializerFeature[]{     //輸出Map中為Null的值     SerializerFeature.WriteMapNullValue,          //如果Boolean對象為Null,則輸出為false     SerializerFeature.WriteNullBooleanAsFalse,          //如果List為Null,則輸出為[]     SerializerFeature.WriteNullListAsEmpty,          //如果Number為Null,則輸出為0     SerializerFeature.WriteNullNumberAsZero,          //輸出Null字串     SerializerFeature.WriteNullStringAsEmpty,          //格式化輸出日期     SerializerFeature.WriteDateUseDateFormat   };      /**    * 把Java對象JSON序列化    * @param obj 需要JSON序列化的Java對象    * @return JSON字串    */   private static String toJSONString(Object obj){     return JSON.toJSONString(obj, features);   }      /**    * 返回JSON格式資料    * @param response    * @param data 待返回的Java對象    * @param encoding 返回JSON字串的編碼格式    */   public static void json(HttpServletResponse response, Object data, String encoding){     //設定編碼格式     response.setContentType("text/plain;charset=" + encoding);     response.setCharacterEncoding(encoding);          PrintWriter out = null;     try{       out = response.getWriter();       out.write(toJSONString(data));       out.flush();     }catch(IOException e){       e.printStackTrace();     }   }      /**    * 返回JSON格式資料,使用預設編碼    * @param response    * @param data 待返回的Java對象    */   public static void json(HttpServletResponse response, Object data){     json(response, data, encoding);   }      /**    * 返回JSONP資料,使用預設編碼和預設回呼函數    * @param response    * @param data JSONP資料    */   public static void jsonp(HttpServletResponse response, Object data){     jsonp(response, callback, data, encoding);   }      /**    * 返回JSONP資料,使用預設編碼    * @param response    * @param callback JSONP回呼函數名稱    * @param data JSONP資料    */   public static void jsonp(HttpServletResponse response, String callback, Object data){     jsonp(response, callback, data, encoding);   }      /**    * 返回JSONP資料    * @param response    * @param callback JSONP回呼函數名稱    * @param data JSONP資料    * @param encoding JSONP資料編碼    */   public static void jsonp(HttpServletResponse response, String callback, Object data, String encoding){     StringBuffer sb = new StringBuffer(callback);     sb.append("(");     sb.append(toJSONString(data));     sb.append(");");      // 設定編碼格式     response.setContentType("text/plain;charset=" + encoding);     response.setCharacterEncoding(encoding);      PrintWriter out = null;     try {       out = response.getWriter();       out.write(sb.toString());       out.flush();     } catch (IOException e) {       e.printStackTrace();     }   }    public static String getEncoding() {     return encoding;   }    public static void setEncoding(String encoding) {     ResponseJsonUtils.encoding = encoding;   }    public static String getCallback() {     return callback;   }    public static void setCallback(String callback) {     ResponseJsonUtils.callback = callback;   } } 
/**  * 在Servlet返回JSON資料  */ @WebServlet("/json.do") public class JsonServlet extends HttpServlet {   private static final long serialVersionUID = 7500835936131982864L;    /**    * 返回json格式資料    */   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          ResponseJsonUtils.json(response, data);   } } 
/**  * Servlet返回JSONP格式資料  */ @WebServlet("/jsonp.do") public class JsonpServlet extends HttpServlet {   private static final long serialVersionUID = -8343408864035108293L;    /**    * 請求會發送callback參數作為回呼函數,如果沒有發送callback參數則使用預設回呼函數    */   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {     //用戶端發送的回呼函數     String callback = request.getParameter("callback");          Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          if(callback == null || callback.length() == 0){       //如果用戶端沒有發送回呼函數,則使用預設的回呼函數       ResponseJsonUtils.jsonp(response, data);     }else{       //使用用戶端的回呼函數       ResponseJsonUtils.jsonp(response, callback, data);     }   } } 
/**  * 在Struts2中返回JSON和JSONP  */ public class JsonAction extends ActionSupport {   private static final long serialVersionUID = 5391000845385666048L;      /**    * JSONP的回呼函數    */   private String callback;      /**    * 返回JSON    */   public void json(){     HttpServletResponse response = ServletActionContext.getResponse();          Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          ResponseJsonUtils.json(response, data);   }      /**    * 返回JSONP    */   public void jsonp(){     HttpServletResponse response = ServletActionContext.getResponse();          Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          if(callback == null || callback.length() == 0){       //如果用戶端沒有發送回呼函數,則使用預設的回呼函數       ResponseJsonUtils.jsonp(response, data);     }else{       //使用用戶端的回呼函數       ResponseJsonUtils.jsonp(response, callback, data);     }   }    public String getCallback() {     return callback;   }    public void setCallback(String callback) {     this.callback = callback;   } } 
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;  /**  * Spring MVC返回JSON和JSONP資料  */ @Controller @RequestMapping("/json") public class JsonController {      /**    * 返回JSON資料    * @param request    * @param response    */   @RequestMapping("/json.do")   public void json(HttpServletRequest request, HttpServletResponse response){     Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          ResponseJsonUtils.json(response, data);   }      /**    * 返回JSONP資料    * @param callback JSONP的回呼函數    * @param request    * @param response    */   @RequestMapping("/jsonp.do")   public void json(String callback, HttpServletRequest request, HttpServletResponse response){     Map<String, Object> data = new HashMap<String, Object>();          data.put("date", new Date());     data.put("email", "accountwcx@qq.com");     data.put("age", 30);     data.put("name", "csdn");     data.put("array", new int[]{1,2,3,4});          if(callback == null || callback.length() == 0){       //如果用戶端沒有發送回呼函數,則使用預設的回呼函數       ResponseJsonUtils.jsonp(response, data);     }else{       //使用用戶端的回呼函數       ResponseJsonUtils.jsonp(response, callback, data);     }   } } 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.