程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Web法式完成前往JSON字符串的辦法總結

Java Web法式完成前往JSON字符串的辦法總結

編輯:關於JAVA

Java Web法式完成前往JSON字符串的辦法總結。本站提示廣大學習愛好者:(Java Web法式完成前往JSON字符串的辦法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是Java Web法式完成前往JSON字符串的辦法總結正文


基本鋪墊
在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)表現按換行縮進兩個空格的方法輸入。
下面只是引見了根本用法,但這其實不是本身想要的,本身想要的是怎樣讓對象屬性為空時前往一個空字符串,而不是甚麼都不前往。固然只要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 [email protected] 
 * 
 */ 
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", "[email protected]"); 
    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", "[email protected]"); 
    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", "[email protected]"); 
    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", "[email protected]"); 
    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", "[email protected]"); 
    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", "[email protected]"); 
    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); 
    } 
  } 
} 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved