JavaWeb程序实现返回JSON字符串的⽅法总结
基础铺垫
在java中,关于json的lib有很多,⽐如jackjson、fastjson、gson等等,本⼈都⽤过,但是对于我等只需要让java对象返回json 字符串即可的程序员来说,还是显得过于繁重。⽽且有些功能定制性很差,⽐如⼀个java对象的属性为空时,这些组件都不会输出,于是本⼈在页⾯循环遍历列表对象时,总是得判断此属性是否为undefined,这⼀点让本⼈很不满意。所以决定花点时间研究下到底是怎么回事。
但经过⼀上午的细看,发现不管是fastjson还是gson都代码都写得相当的复杂,⼜没什么相关的⽂档与注释,最后放弃了。于是⾃⼰⼜在www.json上到了相对很简单的返回json的java包,这个lib只需要5个java类即可运⾏,正合我意。需要注意的是,官⽅的JSONArray这个东西并不⽀持javabean的直接转换,⽐如List<User>这样的东西是不能转换的,必须要把它转换成List<Map>这样的格式,才能转换,所以我对它进⾏了改造。官⽅的⽂件有:
先介绍下基本⽤法。
处理基本的java对象使⽤JSONObject类,⽤法⼤体如下:
public void testMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "qiu");
map.put("password", "123");
map.put("address", "china");
User user = new User();
user.setUserName("qiuqiu");
user.setPassword("123456");
map.put("user", user);
JSONObject json = new JSONObject(map);
System.out.String());
}
如果是collection对象,则采⽤JSONArray类,⽤法如下:
public void testList() throws JSONException{
List<User> list = new ArrayList<User>();
User user = new User();
user.setUserName("qiuqiu");
user.setPassword("123456");
User user2 = new User();
user2.setUserName("中国");
list.add(user);
list.add(user2);
JSONArray json = new JSONArray(list);
System.out.String(2));
}
由上⾯的代码可以看出,这个lib的⽤法相当的简单,不像什么gson之类得新创建个对象,fastjson的API设计也有些不合理。上⾯的第⼆段代码中,有个toString(2)表⽰按换⾏缩进两个空格的⽅式输出。
上⾯只是介绍了基本⽤法,但这并不是⾃⼰想要的,⾃⼰想要的是怎么让对象属性为空时返回⼀个空字符串,⽽不是什么都不返回。虽然只有5个类,但本⼈还是花了两三个⼩时的才到地⽅,在JSONObject中有个叫populateMap的⽅法,在最后有⼩段代码:
Object result = method.invoke(bean, (Object[])null);
if (result != null) {
this.map.put(key, wrap(result));
}
即当调⽤get⽅法返回为null时,就不输出此属性。当然改起来就很简单了:
Object result = method.invoke(bean, (Object[])null);
this.map.put(key, result==null?"":wrap(result));
这样总算解决了本⼈想要解决的问题。当然这个lib是json官⽅⾃带的,写得相当的简单,⽐较适合⼀次数据只有⼏条或者⼏⼗条的情况,如分页显⽰等。如果⼀次传输数据量⽐较⼤的话,可以考虑使⽤fastjs
on等。但个⼈觉得对于⼤多数场合来说,最需要的是可定制性。⽐如偶尔发现个某组件不能满⾜的需要,结果此组件即⽆⽂档也⽆注释,代码⼜⽐较难理解,基本上跟没开源差不多,那就没什么意义了。
实例总结
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
*
*/
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){
JSONString(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 = Writer();
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 = Writer();
out.String());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getEncoding() {
return encoding;
}
public static void setEncoding(String encoding) {
}
public static String getCallback() {
return callback;
}
public static void setCallback(String callback) {
ResponseJsonUtils.callback = callback;
}
}
/**
* 在Servlet返回JSON数据
*/
fastjson常用方法@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");
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 = Parameter("callback");
Map<String, Object> data = new HashMap<String, Object>();
data.put("date", new Date());
data.put("email", "accountwcx@qq");
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 = Response();
Map<String, Object> data = new HashMap<String, Object>();
data.put("date", new Date());
data.put("email", "accountwcx@qq");
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 = Response();
Map<String, Object> data = new HashMap<String, Object>();
data.put("date", new Date());
data.put("email", "accountwcx@qq");
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");
data.put("age", 30);
data.put("name", "csdn");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论