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);
    }
  }
}
(0)

相关推荐

  • java编程下字符串的16位,32位md5加密实现方法

    如下所示: package cn.sunzn.md5; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Str2MD5 { public static void main(String[] args) { MD5("sunzn"); } private static String MD5(String sourceStr) { String r

  • 用Java将字符串的首字母转换大小写

    话不多说,直接上代码 //首字母转小写 public static String toLowerCaseFirstOne(String s){ if(Character.isLowerCase(s.charAt(0))) return s; else return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } //首字母转大写 public

  • java字符串抉择

    下面我们就字符串连接方面分析. 1.String 打开String的源码,如图所示 会发现存储字符串的字符数值是final常量.再看String的构造方法,发现String的value值在构造方法就确定了值.这里有必要说明下关键字final final修饰的属性为常量(值不可改变),要么在声明的同时赋值,要么在构造方法里面进行赋值,一旦赋值就不能改变. 所以,用String来实现字符串拼接,由于String的值不可改变,所以每次拼接都要生成一个新的String来存储新的字符串.所以使用Strin

  • Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好,下面先看下JSON的格式, JSON可以有两种格式,一种是对象格式的,另一种是数组对象, {"name":"JSON","address":"北京市西城区","age":25}//JSON的对象格式的字符串 [

  • java从字符串中提取数字的简单实例

    随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取出来呢?大致有以下几种方法,正则表达式,集合类,还有就是String类提供的方法. 1 String类提供的方法: package 测试练习; import Java.util.*; public class get_StringNum { /** *2016.10.25 */ public static void main(Strin

  • Java中字符串与byte数组之间的相互转换

    前言 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成byte数组型,java在字符与数组转换也是非常方便的.下面跟我一起来了解一下字符串与byte之间转换的原理 原理 我们都知道,在Java里byte类型是占用1个字节,即8位的,而16进制的字符占用4位,所以每个byte可以用两个字符来表示,反之亦然. 举个例子 byte = 123 用二进制表示:0111 1011 每4位用字符表示: 7 b 是的,原理就这么简单,接下来用代码实现: byte[] 转1

  • Java Web程序实现返回JSON字符串的方法总结

    基础铺垫 在java中,关于json的lib有很多,比如jackjson.fastjson.gson等等,本人都用过,但是对于我等只需要让java对象返回json字符串即可的程序员来说,还是显得过于繁重.而且有些功能定制性很差,比如一个java对象的属性为空时,这些组件都不会输出,于是本人在页面循环遍历列表对象时,总是得判断此属性是否为undefined,这一点让本人很不满意.所以决定花点时间研究下到底是怎么回事. 但经过一上午的细看,发现不管是fastjson还是gson都代码都写得相当的复杂

  • Java Web程序中利用Spring框架返回JSON格式的日期

    返回Json时格式化日期Date 第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@ResponseBody返回json时,日期格式默认显示为时间戳的问题.需配合<mvc:message-converters>使用 */ @Component("customObjectMapper") public class CustomObjectMapper extends ObjectMapper { public CustomObject

  • 使用SpringMVC返回json字符串的实例讲解

    最近开始接触SpringMVC这个框架,这个框架使用起来很方便,框架搭起来之后,写起代码几乎都是一个模式.当然要走到这一步必须保证你的SpringMVC的相关配置都已经完成,并且配置正确! 作为我的关于S平ringMVC的首篇博客,本篇博客主要说名如何配置SpringMVC,并且可以使之正常的返回Bean实体,这里的bean实体一般返回到前端都是以Json字符串的形式返回的. 使用的开发工具为eclipse,这个也是比较大众化的开发工具了,算的上是人人都会使用的了,只是熟练程度不一样! 具体的配

  • java 通过发送json,post请求,返回json数据的方法

    实例如下所示: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import org.json.JSONArray; impo

  • 快速解决owin返回json字符串多带了双引号"多了重string转义字符串

    解决方法: [HttpGet] public HttpResponseMessage getsystemtime() { cltime time = new cltime(); time.datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string relsut = JsonConvert.SerializeObject(time); var resp = new HttpResponseMessage { Conten

  • 快速解决owin返回json字符串多带了双引号"多了重string转义字符串

    解决方法: [HttpGet] public HttpResponseMessage getsystemtime() { cltime time = new cltime(); time.datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string relsut = JsonConvert.SerializeObject(time); var resp = new HttpResponseMessage { Conten

  • ASP.NET使用Ajax返回Json对象的方法

    一.新建一个html页面,如注册页面"Register.htm" <!DOCTYPE html> <html > <head> <title>用户注册</title> <meta charset="utf-8" /> <style type="text/css"> .msg { color:Red; } </style> </head> &

  • yii2使用ajax返回json的实现方法

    本文实例讲述了yii2使用ajax返回json的实现方法.分享给大家供大家参考,具体如下: public function actionAjax() { if(isset(Yii::$app->request->post('test'))){ $test = "Ajax Worked!"; // do your query stuff here }else{ $test = "Ajax failed"; // do your query stuff he

  • python和flask中返回JSON数据的方法

    在python中可以使用json将数据格式化为JSON格式: 1.将字典转换成JSON数据格式: s=['张三','年龄','姓名'] t={} t['data']=s return json.dumps(t,ensure_ascii=False) 2.将列表转换成JSON数据格式: s=['张三','年龄','姓名'] return json.dumps(s,ensure_ascii=False) 使用json转换的在前端显示的数据为JSON字符串. 使用flask的jsonify转换后,在前

  • java读取文件内容为string字符串的方法

    直接就把项目中的方法贴出来吧 /** * 读出城市列表文件 */ private String readCityFile() { File file02 = new File(path_xinfu, "/cityList.json"); FileInputStream is = null; StringBuilder stringBuilder = null; try { if (file02.length() != 0) { /** * 文件有内容才去读文件 */ is = new

随机推荐