Java Web返回JSON

来源:互联网 发布:js监听手机输入法弹出 编辑:程序博客网 时间:2024/04/28 13:58

Web项目中经常涉及到AJAX请求返回JSONJSONP数据。JSON数据在服务器端和浏览器端传输,本质上就是传输字符串,不过这个字符串符合JSON语法格式。浏览器端会按照普通文本的格式接收JSON字符串,最终JSON字符串转成JSON对象通过JavaScript实现。目前部分浏览器(IE9以下浏览器没有提供)和常用的JS都提供了JSON序列化和反序列化的方法,如jQueryAJAX请求可以指定返回的数据格式,包括textjsonjsonpxmlhtml等。

Web服务器端只要把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 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,则输出为falseSerializerFeature.WriteNullBooleanAsFalse,//如果List为Null,则输出为[]SerializerFeature.WriteNullListAsEmpty,//如果Number为Null,则输出为0SerializerFeature.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);}}}



0 0
原创粉丝点击