Java Web返回JSON工具类

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

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 [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);
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 03:27:06

Java Web返回JSON工具类的相关文章

Java Web返回JSON

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

Java Web的分页工具类

最近写一个java web项目,以前分页的工具类,都是基础架构的人写好了的.也没有去细看,现在遇到这个状况. 就整理一下思路,自己写了一个分页的工具类.写的不好之处,还望斧正. 下面是我的代码: PageUtil.java 1 package util; 2 3 import java.util.Map; 4 5 /** 6 * 分页工具类 7 * @author lyh 8 * 9 */ 10 public class PageUtil { 11 private int total; //总数

JAVA中封装JSONUtils工具类及使用

在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. 封装后的JSON工具类JSONUtils.java代码如下: JSONUtils代码,点击展开 import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Itera

强大的Java Json工具类

转自: https://blog.csdn.net/u014676619/article/details/49624165 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.

Json工具类 - JsonUtils.java

Json工具类,提供Json与对象之间的转换. 源码如下:(点击下载 - JsonUtils.java . gson-2.2.4.jar ) import java.lang.reflect.Type; import java.util.Map; import com.google.gson.Gson; import com.google.gson.GsonBuilder; /** * Json工具类 * */ @SuppressWarnings("unchecked") public

java后端时间处理工具类,返回 &quot;XXX 前&quot; 的字符串

转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示xxx之前回复),我们可以在后端进行处理,也可以在前端进行处理,这里讲讲在后端进行处理的方法. 其实很简单,我们只需要将从数据库中取到的date类型的字段进行处理. 工具类如下: import java.text.SimpleDateFormat; import java.util.Date; /** * 日

HttpClientUntils工具类的使用及注意事项(包括我改进的工具类和Controller端的注意事项【附 Json 工具类】)

HttpClient工具类(我改过): package com.taotao.httpclient; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.client.entity.Ur

java中常用的工具类(三)

继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加

package com.aherp.framework.util; import java.lang.reflect.Array;import java.lang.reflect.Method;import java.util.Collection;import java.util.Iterator;import java.util.Map; import org.json.JSONArray;import org.json.JSONException;import org.json.JSONO