Web项目中经常涉及到AJAX请求返回JSON和JSONP数据。JSON数据在server端和浏览器端传输,本质上就是传输字符串,只是这个字符串符合JSON语法格式。浏览器端会依照普通文本的格式接收JSON字符串。终于JSON字符串转成JSON对象通过JavaScript实现。眼下部分浏览器(IE9下面浏览器没有提供)和经常使用的JS库都提供了JSON序列化和反序列化的方法。如jQuery的AJAX请求能够指定返回的数据格式,包含text、json、jsonp、xml、html等。
Webserver端仅仅要把Java对象数据转成JSON字符串。并把JSON字符串以文本的形式通过response输出就可以。
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 {
//client发送的回调函数
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){
//假设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", "[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){
//假设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", "[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){
//假设client没有发送回调函数,则使用默认的回调函数
ResponseJsonUtils.jsonp(response, data);
}else{
//使用client的回调函数
ResponseJsonUtils.jsonp(response, callback, data);
}
}
}
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/13984.html