十三、 JSON 数据处理
在 SpringMVC 中使用的是 Jackson API 实现对 JSON 格式数据处理。需要添加 Jackson 的 jar 包。
jackson-annotations-2.11.0.jar
jackson-core-2.11.0.jar
jackson-databind-2.11.0.jar
1 搭建环境
1.1创建项目添加依赖
1.2添加 Jquery.js
2 处理请求中的 JSON 格式数据
在处理请求中的 JSON 格式数据时需要使用@RequestBody 注解。
[email protected]
@RequestBody 注解可以将 JSON 格式的数据转为 Java 对象。但是要求 content-type 不是 默认的 application/x-www-form-urlcoded 编码的内容。一般情况下来说常用其来处理 application/json 类型。
2.2创建 Users
package com.bjsxt.web.controller;
public class Users {
private String username;
private int userage;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserage() {
return userage;
}
public void setUserage(int userage) {
this.userage = userage;
}
@Override
public String toString() {
return "Users{" +
"username='" + username + '\'' +
", userage=" + userage +
'}';
}
}
2.3创建页面
<%--
Created by IntelliJ IDEA.
User: HP
Date: 2020/12/23
Time: 20:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="/js/jquery.js"></script>
<script>
$(function(){
$("#btn").click(function(){
var name = $("#username").val();
var age=$("#userage").val();
var obj={
username:name,
userage:age
};
var user=JSON.stringify(obj);
debugger
$.ajax({
url:"/user/addUsers",
contentType:"application/json",
type:"post",
data:user,
success:function(res){
alert(res);
}
})
})
})
</script>
</head>
<body>
用户姓名:<input type="text" name="" id="username"/><br/>
用户年龄:<input type="text" id="userage"/><br/>
<input type="button" value="ok" id="btn">
</body>
</html>
2.4创建页面跳转控制器
package com.bjsxt.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/page")
public class PageController {
@RequestMapping("/{page}")
public String showPage(@PathVariable String page) {
return page;
}
}
2.5创建处理 JSON 的控制器
package com.bjsxt.web.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Controller
@RequestMapping("/user")
public class UsersController {
@RequestMapping("/addUsers")
public void addUsers(@RequestBody Users users, HttpServletResponse response) throws Exception{
System.out.println(users);
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}
/*
@RequestMapping("/addUsers")
@ResponseBody
public String addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return "ok";
}*/
/*@RequestMapping("/addUsers")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
// 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
/*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
}
运行结果:
注意页面文件里面的btn前面根据id选择需要加#,还有JSON.sringfiy(obj)括号里面需要写js对象。
响应头没有content-type
3 处理响应中的 JSON 格式数据
将响应结果转换成 JSON 格式数据时,需要使用@ResponseBody 注解。
[email protected]
@ResponseBody 注解的作用是将处理请求方法返回的对象通过转换器转换为 JSON 格式 数据,同时写入到 response 对象的 body 区,通常用来返回 JSON 数据。需要注意,在使用此注解之后不会再走视图解析器,而是直接将数据写入到输出流中,他的效果等同于通过 response 对象输出指定格式的数据。 如果处理请求方法返回的是 String 时,@ResponseBody 注解不会进行 JSON 转换。响应 的 Content-Type 为 text/plain;charset=ISO-8859-1。 如果处理请求方法返回的是除了 String 类型以外的其他 Object 类型时,@ResponseBody 注解会进行 JSON 转换。响应的 Content-Type 为 application/json。
3.2修改控制器
package com.bjsxt.web.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Controller
@RequestMapping("/user")
public class UsersController {
/*@RequestMapping("/addUsers")
public void addUsers(@RequestBody Users users, HttpServletResponse response) throws Exception{
System.out.println(users);
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}*/
@RequestMapping("/addUsers")
@ResponseBody
public String addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return "ok";
}
/*@RequestMapping("/addUsers")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
// 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
/*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
}
运行结果:
返回类型String,响应体中的数据是iso-8859-1编码方式的文本类型。
修改控制器:
package com.bjsxt.web.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Controller
@RequestMapping("/user")
public class UsersController {
/*@RequestMapping("/addUsers")
public void addUsers(@RequestBody Users users, HttpServletResponse response) throws Exception{
System.out.println(users);
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}*/
/*@RequestMapping("/addUsers")
@ResponseBody
public String addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return "ok";
}*/
@RequestMapping("/addUsers")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}
// 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
/*@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
}
运行结果:
返回值写不是字符串的类,响应体中的数据类型是json,编码方式无。
修改jsp文件
<%--
Created by IntelliJ IDEA.
User: HP
Date: 2020/12/23
Time: 20:57
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="/js/jquery.js"></script>
<script>
$(function(){
$("#btn").click(function(){
var name = $("#username").val();
var age=$("#userage").val();
var obj={
username:name,
userage:age
};
var user=JSON.stringify(obj);
debugger
$.ajax({
url:"/user/addUsers",
contentType:"application/json",
type:"post",
data:user,
success:function(res){
//alert(res);
alert(res.username+","+res.userage);
}
})
})
})
</script>
</head>
<body>
用户姓名:<input type="text" name="" id="username"/><br/>
用户年龄:<input type="text" id="userage"/><br/>
<input type="button" value="ok" id="btn">
</body>
</html>
运行结果:
显示js对象的具体属性值。响应体数据的类型是json类型。
3.3解决响应的 JSON 数据中文乱码问题
修改控制器
package com.bjsxt.web.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Controller
@RequestMapping("/user")
public class UsersController {
/*@RequestMapping("/addUsers")
public void addUsers(@RequestBody Users users, HttpServletResponse response) throws Exception{
System.out.println(users);
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}*/
/*@RequestMapping("/addUsers")
@ResponseBody
public String addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return "ok";
}*/
/*@RequestMapping("/addUsers")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}*/
// 解决中文乱码增加produces响应体中的数据类型,以及编码解码字符集
@RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
@ResponseBody
public Users addUsers(@RequestBody Users users) throws Exception{
System.out.println(users);
return users;
}
}
运行结果:
响应体数据类型是json并且按照utf-8格式编码解码。
总结:
@RequestBody 将前端的json格式的字符串转为一个java对象。需要发送post类型请求。
@ResponseBody 将返回的字符串写入响应中的响应体,格式为文本,字符集iso-8859-1。返回的java对象写入响应中的响应体,格式为json,字符集没有。如果在@RequestBody中加上reduce参数,使用MediaType或者字符串直接写响应体中的数据格式和字符集,那么可以解决乱码问题。