在后台向前端返回数据时,JSON字符串一般是首选的方式,但是有时候会出现中文乱码的情况,使用这个工具类,解决了我的中文乱码的问题,记录踩坑过程。

直接上代码,不知道这个工具类的出自哪里,但是是真的强大!

import java.io.Serializable;
/**
 * 用于封装服务器到客户端的Json返回值
 * @author soft01
 *
 */
public class JsonResult<T> implements Serializable {
    //Serializable将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本
    public static final int SUCCESS=0;
    public static final int ERROR=1;
    public static final int OTHER=2;

    private int state;
    private String message = "";
    private T data;
    private String pass="";

    public JsonResult(){
        state = SUCCESS;
    }
    //为了方便,重载n个构造器
    public JsonResult(int state, String message, T data) {
        super();
        this.state = state;
        this.message = message;
        this.data = data;
    }
    public JsonResult(int state,String error){
        this(state,error,null);
    }
    public JsonResult(int state,T data){
        this(state,"",data);
    }
    public JsonResult(String error){
        this(ERROR,error,null);
    }

    public JsonResult(T data){
        this(SUCCESS,"",data);
    }
    public JsonResult(int state){
        this(state,"",null);
    }
    public JsonResult(Throwable e){
        this(ERROR,e.getMessage(),null);
    }
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    public static int getSuccess() {
        return SUCCESS;
    }
    public static int getError() {
        return ERROR;
    }
    @Override
    public String toString() {
        return "JsonResult [state=" + state + ", message=" + message + ", pass=" + pass + ", data=" + data + "]";
    }
}

由于工具类使用的是泛型类,我们可以根据需要,返回一个类或者集合都可以,只是在controller类里返回的类型稍微有点区别而已。

可以看到这个工具类返回的数据有三个,分别是:state,message,data,其中data就是我们主要用到的JSON字符串

在controller类里面直接将查询到的数据借助这个工具类封装成JSON字符串即可返回:

    @RequestMapping("/selectInfoForUser")
    @ResponseBody
    public JsonResult<Map<String, String>> selectInfoForUser(){
        Map map=new HashMap();
        map.put("userid", 1);
        Map<String, String> userInfo = userServiceImpl.selectInfoForUser(map);
        //System.out.println("这是小程序端调用的");
        //String userInfojsonString = JSON.toJSONString(userInfo);
        return new JsonResult<Map<String, String>>(0,"成功",userInfo);
    }

由于这里使用的查询结束之后返回的是map类型,所以使用的是JsonResult<Map<String, String>>,List如同Map,如果只返回一个实体类User,则返回类型直接是JsonResult<User>,其中@ResponseBody 的作用是直接将json字符串返回到当前页面,如果不加的话,会报错,因为springmvc配置文件一般都配置了前后缀,使得return后面的字符串会当成jsp页面处理

在前端页面则直接可以使用data.data 取得JSON对象,具体的可以在前端页面测试打印,然后截取需要的数据。