Java Web返回JSON详解编程语言

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

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

(0)
上一篇 2021年7月19日 16:26
下一篇 2021年7月19日 16:27

相关推荐

发表回复

登录后才能评论