SpringMVC接收json和处理json乱码问题、JSON parse error: Unrecognized token
SpringMVC环境下发送Ajax请去
- 前端发送过来的,后端要处理的请求有两种
- 普通请求:后端处理完返回页面,浏览器使用页面替换整个窗口的内容。
- 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. 注意
- 开启 springmvc 的注解驱动
- 必须有 jackson依赖
- 扩展名要和实际返回的数据类型一致
响应体返回 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]
},
})
浏览器开发者工具看到的请求体
- jQuery 私自在请求参数名字后面附加了 ’[]‘
后端接收数据
@RequestParam("empldArray[]") integer[] empldArray
- 这里一定要带上多出来的方括号!!!
结论
- 不建议采用这个方案。
方案二、
前端发送数据
$.ajax({
"url":"send/array/plan/two.html",
"type":"post",
"data":{
"empId":5,
"empId":8,
"empId":12
},
浏览器开发者工具看到的请求体
后端接收数据
@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 格式
浏览器开发者工具看到的请求体
后台接口数据
@ResponseBody
@RequestMapping("/send/array/plan/three")
public String receiveArrayPlanThree(@RequestBody Integer[] empIdArray) {
for (Integer empId : empIdArray) {
System.out.println(empId);
}
return "success";
}
结论:
- 建议使用的方案
需要注意的点
前端
- 首先准备好要发送的 json数据
json对象
json数组 - 将 json对象或 json数组转换为 json字符串
var arrayStr = JSON.stringify(array);
- 将 json字符串直接赋值给 data属性
data:arrayStr
- 必须设置 contentType
contentType:"application/json;charset=utf-8"
后端
- 加入 jackson 依赖
- 开启注解驱动
- 使用注解
@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