Java Web返回JSON

Web項目中常常涉及到AJAX請求返回JSONJSONP數據。JSON數據在server端和瀏覽器端傳輸,本質上就是傳輸字符串,只是這個字符串符合JSON語法格式。瀏覽器端會依照普通文本的格式接收JSON字符串。終於JSON字符串轉成JSON對象經過JavaScript實現。眼下部分瀏覽器(IE9下面瀏覽器沒有提供)和常用的JS都提供了JSON序列化和反序列化的方法。如jQueryAJAX請求可以指定返回的數據格式,包含textjsonjsonpxmlhtml等。html

Webserver端僅僅要把Java對象數據轉成JSON字符串。並把JSON字符串以文本的形式經過response輸出就能夠。java

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 {
		//client發送的回調函數
		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){
			//假設client沒有發送回調函數。則使用默認的回調函數
			ResponseJsonUtils.jsonp(response, data);
		}else{
			//使用client的回調函數
			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){
			//假設client沒有發送回調函數,則使用默認的回調函數
			ResponseJsonUtils.jsonp(response, data);
		}else{
			//使用client的回調函數
			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){
			//假設client沒有發送回調函數,則使用默認的回調函數
			ResponseJsonUtils.jsonp(response, data);
		}else{
			//使用client的回調函數
			ResponseJsonUtils.jsonp(response, callback, data);
		}
	}
}
相關文章
相關標籤/搜索