Java Web程序实现返回JSON字符串的方法总结
基础铺垫
在java中,关于json的lib有很多,比如jackjson、fastjson、gson等等,本人都用过,但是对于我等只需要让java对象返回json字符串即可的程序员来说,还是显得过于繁重。而且有些功能定制性很差,比如一个java对象的属性为空时,这些组件都不会输出,于是本人在页面循环遍历列表对象时,总是得判断此属性是否为undefined,这一点让本人很不满意。所以决定花点时间研究下到底是怎么回事。
但经过一上午的细看,发现不管是fastjson还是gson都代码都写得相当的复杂,又没什么相关的文档与注释,最后放弃了。于是自己又在www.json.com上找到了相对很简单的返回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"); user.gettels().add("1234444556677"); user.gettels().add("6893493458585"); map.put("user", user); jsonobject json = new jsonobject(map); system.out.println(json.tostring()); }
如果是collection对象,则采用jsonarray类,用法如下:
public void testlist() throws jsonexception{ list<user> list = new arraylist<user>(); user user = new user(); user.setusername("qiuqiu"); user.setpassword("123456"); user.gettels().add("1234444556677"); user.gettels().add("6893493458585"); user user2 = new user(); user2.setusername("中国"); user2.gettels().add("1234444556677"); user2.gettels().add("6893493458585"); list.add(user); list.add(user2); jsonarray json = new jsonarray(list); system.out.println(json.tostring(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官方自带的,写得相当的简单,比较适合一次数据只有几条或者几十条的情况,如分页显示等。如果一次传输数据量比较大的话,可以考虑使用fastjson等。但个人觉得对于大多数场合来说,最需要的是可定制性。比如偶尔发现个某组件不能满足的需要,结果此组件即无文档也无注释,代码又比较难理解,基本上跟没开源差不多,那就没什么意义了。
实例总结
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,则输出为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", "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); } } }
上一篇: PHP简单装饰器模式实现与用法示例