SpringMVC接收json和处理json乱码问题、JSON parse error: Unrecognized token

SpringMVC环境下发送Ajax请去

  • 前端发送过来的,后端要处理的请求有两种
    1. 普通请求:后端处理完返回页面,浏览器使用页面替换整个窗口的内容。
    2. ajax请求:后端处理完通常返回 json数据,jQuery代码使用 json数据对页面局部刷新。
  • 加入 spring进行 json数据转换的 jar

@ResponseBody 注解

1. 作用

  • 让 handler方法的返回值本身就是当前请求的响应数据。不再参考视图处理器中配置的前后缀信息。
//示例
@Controller
public class AjaxHandler {
	@ResponseBody
	@RequestMapping("/get/emp/by/ajax")
	public Employee getEmployeeByAjax() {
		return new Employee(555, "empName555", 555.55);
	}
}

2. 注意

  1. 开启 springmvc 的注解驱动
  2. 必须有 jackson依赖
  3. 扩展名要和实际返回的数据类型一致
    响应体返回 json
    请求扩展名 *.json
    web.xml 中 DispatcherServlet 必须映射 *.json扩展名。

@RequestBody 注解

  • 场景设定:jQuery通过 Ajax请求给服务器端发送一个数组:[5,8,12]

方案一、

前端发送请求

$.ajax({
	"url":"send/array/plan/one.html",//请路径
	"type":"post",//请求方式
	"data":{     //需要传输的数据
		"empIdArray":[5,8,12]
		},
})

浏览器开发者工具看到的请求体
image

  • jQuery 私自在请求参数名字后面附加了 ’[]‘

后端接收数据

@RequestParam("empldArray[]") integer[] empldArray
  • 这里一定要带上多出来的方括号!!!

结论

  • 不建议采用这个方案。

方案二、

前端发送数据

$.ajax({
	"url":"send/array/plan/two.html",
	"type":"post",
	"data":{
		"empId":5,
		"empId":8,
		"empId":12
	},

浏览器开发者工具看到的请求体
image

后端接收数据

@RequestParam("empId") Integer empId

结论

  • 这个方案不成立!

方案三、

前端发送数据

// 准备要发送的数组
var array = [5,8,12];
// 将JSON 数组转换成JSON 字符串
// "[5,8,12]"
var arrayStr = JSON.stringify(array);
// 发送Ajax 请求
$.ajax({
	"url":"send/array/plan/three.html",
	"type":"post",
	"data":arrayStr, // JSON 字符串作为请求体
	"contentType":"application/json;charset=UTF-8", // 告诉服务器端当前请求的请求体是JSON 格式

浏览器开发者工具看到的请求体
image
后台接口数据

@ResponseBody
@RequestMapping("/send/array/plan/three")
public String receiveArrayPlanThree(@RequestBody Integer[] empIdArray) {
	for (Integer empId : empIdArray) {
		System.out.println(empId);	
	}
	return "success";
}

结论:

  • 建议使用的方案

需要注意的点

前端

  1. 首先准备好要发送的 json数据
    json对象
    json数组
  2. 将 json对象或 json数组转换为 json字符串
    var arrayStr = JSON.stringify(array);
  3. 将 json字符串直接赋值给 data属性
    data:arrayStr
  4. 必须设置 contentType
    contentType:"application/json;charset=utf-8"

后端

  1. 加入 jackson 依赖
  2. 开启注解驱动
  3. 使用注解
    @RequestBody Integer [] empldArray

小结

  • @RequestBody 使用场景。传统发送请求参数不方便发送的数据,使用 json请去体的方式发送。特别是要发送复杂对象的时候。

对比

工具类

/**
 * @author zhaokuii11@163.com
 * @create 2021-12-01 20:16
 * @Description 统一整个项目中 Ajax请求返回的结果【未来也可以用户分布式框架各个模块间调用时返回统一类型】
 */
public class ResultEntity<T> {
    public static final String SUCCESS = "success";
    public static final String FAILED = "failed";
    /**
     * 用来封装当前请去处理的结果是成功还是失败
     */
    private String result;
    /**
     * 请去处理失败时返回的错误信息
     */
    private String message;
    /**
     * 要返回的数据
     */
    private T data;

    /**
     * 请求处理成功且不需要返回数据使用的工具方法
     * 【增删改的】
     *
     * @param <Type>
     * @return
     */
    public static <Type> ResultEntity<Type> successWithoutData() {
        return new ResultEntity<Type>(SUCCESS, null, null);
    }

    /**
     * 请求处理成功且需要返回数据的方法
     * 【查询的】
     *
     * @param data   要返回的数据
     * @param <Type>
     * @return
     */
    public static <Type> ResultEntity<Type> successWithData(Type data) {
        return new ResultEntity<Type>(SUCCESS, null, data);
    }

    /**
     * 请求处理失败使用的工具方法
     * 【失败的】
     *
     * @param message 失败的错误消息
     * @param <Type>
     * @return
     */
    public static <Type> ResultEntity<Type> failed(String message) {
        return new ResultEntity<Type>(FAILED, message, null);
    }

    public ResultEntity() {
    }

    public ResultEntity(String result, String message, T data) {
        this.result = result;
        this.message = message;
        this.data = data;
    }

    @Override
    public String toString() {
        return "ResultEntity{" +
                "result='" + result + '\'' +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

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

参考

解决 json 乱码 问题 https://blog.csdn.net/qq_39494996/article/details/82532673
springmvc 接收json的方式 https://www.cnblogs.com/zzsuje/articles/10329948.html
JSON parse error: Unrecognized token 前端400错误解决 https://blog.csdn.net/shenjuntao520/article/details/115461452
http请求415,后台没有接收参数 https://www.cnblogs.com/wangqiao170/p/9121374.html

posted @ 2021-11-10 21:20  MikiKawai  阅读(524)  评论(0编辑  收藏  举报