一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
一、javaBean和Json的对比
java转换为json 的过程一般会称为 “序列化”
json转换为java 的过程一般会称为 “反序列化”
Json的属和字符串值 必须要用双引号“” 不能用单引号
| Java | Json |
|---|---|
| String | "xxx" |
| Integer | 123 |
| javaBean\MapUser属性:id 、 name | {"id":1,"name","xushu"} |
| 数组、集合:String[] \ List | ["a","b","c"] |
| List< User> List< Map> | [{"id":1,"name","xushu"},{"id":1,"name","xushu"},{"id":1,"name","xushu"}] |
| User属性 id name Role role | {"id":1,"name","xushu","role":{"id":1,"name":"管理员"}} |
| User 属性 id name List | {"id":1,"name","xushu","role":[{"id":1,"name":"管理员"}{"id":2,"name":"普通员工"}]} |
二、SpringMVC的返回JSON数据
到目前为止我们编写的所有Controller的方法的返回值都是String类型,但是大家应该都知道,我们有时候数据传递特别是在ajax中,我们返回的数据经常需要使用json,那么如何来保证返回的数据的是json格式呢?使用@ResponseBody注解
2-1、导入json包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.2</version>
</dependency>
maven导入包成功之后,如果用IDE需要将包添加到lib中
2-2、使用@ResponseBody的方式返回json
2-2-1、创建控制器
首先我们需要给方法添加@ResponseBody的注解,加上这个注解之后,return 返回的值,如果视图解析器解析不到,会通过json的方式返回到页面(必须已经添加了json包)
package com.jony.controller;
import com.jony.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/json")
public class IndexController {
@RequestMapping("/getj")
@ResponseBody
public User getJson(){
User user = new User(1, "张三");
return user;
}
}
2-2-2、测试
2-3、使用@RestController的方式返回json
@RestController注解是放到类上,就都按照Json的方式返回,不论视图解析器是否能解析到,相当于所有的方法都加上@ResponseBody注解
三、返回Json数据的过滤
我们一般查询用户信息,是不希望把一些隐私信息也回传给前端的,比如密码。
我们可以将User 对象放到map中,这样我们只需要把需要给前端的属性放到map中,然后返回map即可,但是这样太繁琐了,Json给我们提供了更加便捷的方式。
可以看到不仅密码显示出来了,日期也显示的格式不是我们想要的。
3-1、使用Json注解
@JsonIgnore :Json序列化时,忽略这个属性 @JsonFormart:将属性进行格式化
@JsonIgnore
private String password;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
3-2、测试
可以看到,密码已经不可见,并且日期已经安装yyyy-MM-dd的方式格式化了。
四、SpringMVC的获取JSON数据
前面提到了从控制器向前端发送Json数据,下面我们来看一下前端如何向控制器发送Json数据。
4-1、前端向控制器发送数据的类型
前端向控制器一般情况会发送一下数据类型:
1、String/Integer/Double/Float等这种单一数据类型。
2、javaBean实体的方式,比如发送一个User
3、Map方式的发送,一般就是以key-value的方式
4、List方式的发送,一般会发送一组数据
4-1-1、创建前端页面模拟各类型发送数据
主要使用jquery ajax的方式发送json数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript">
// 也没加载事件简写方式
$(function(){
$("#btnJson1").click(function(){
$.ajax({
url:"${pageContext.request.contextPath}/json/request01",
method:"post",
data:"张三",
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson2").click(function(){
var user={'id':'1','name':'张三'}; // 定义js对象
var jsonValue=JSON.stringify(user); // 对象转换为json字符串
console.log(jsonValue)
$.ajax({
url:"${pageContext.request.contextPath}/json/request02",
method:"post",
data:'{"id":"1","name":"张三","birthady":"2019-01-01"}',
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson3").click(function(){
$.ajax({
url:"${pageContext.request.contextPath}/json/request03",
method:"post",
data:'{"idxx":"1","namexx":"张三","birthadyxx":"2019-01-01"}',
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
$("#btnJson4").click(function(){
var listUser=new Array();
var user1={"id":"1","name":"张三","birthady":"2019-01-01"};
var user2={"id":"2","name":"李四","birthady":"2019-01-01"};
listUser.push(user1)
listUser.push(user2)
$.ajax({
url:"${pageContext.request.contextPath}/json/request04",
method:"post",
//data:'[{"id":"1","name":"张三","birthady":"2019-01-01"},{"id":"2","name":"李四","birthady":"2019-01-01"}]',
data:JSON.stringify(listUser),
contentType:'application/json',
dataType:"json",
success:function(user){
alert(user.name);
}
});
});
})
</script>
</head>
<body>
<input type="button" value="发送单个参数的json数据" id="btnJson1"/><br/>
<input type="button" value="发送对象的json数据用javaBean接收" id="btnJson2"/><br/>
<input type="button" value="发送对象的json数据用Map接收" id="btnJson3"/><br/>
<input type="button" value="发送数组对象的json数据用List<User>接收" id="btnJson4"/><br/>
</body>
</html>
4-1-2、控制器接收不同的参数
控制器接收参数的方法,主要有两个注解:
@ResponseBody:响应的Json转换
@RequestBody:接收参数的Json转换(这样传过来的数据就必须是json类型)
同时在@RequestMapping中设置了consumer="application/json" 这样就只能是json请求才可以进入到方法。
package com.jony.controller;
import com.jony.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Controller
public class IndexController {
@RequestMapping("/getj")
public User getJson(){
User user = new User(1, "张三","123",new Date());
return user;
}
@RequestMapping("/jpage")
public String toJsonPage(){
return "json";
}
//获得单值数据
@PostMapping("/json/request01")
@ResponseBody
public User responseJson(@RequestBody String name){
User user = new User(1, "黄飞鸿","12346",new Date());
System.out.println(name);
return user;
}
//获得User对象
@PostMapping(value="/json/request02",consumes = "application/json")
@ResponseBody
public User requestJson02(@RequestBody User user){
User user2 = new User(1, "黄飞鸿","12346",new Date());
System.out.println(user);
return user2;
}
//获得map
@PostMapping(value="/json/request03",consumes = "application/json")
@ResponseBody
public User requestJson03(@RequestBody Map<String,String> map){
User user2 = new User(1, "黄飞鸿","12346",new Date());
System.out.println(map);
return user2;
}
//获得list
@PostMapping(value="/json/request04",consumes = "application/json")
@ResponseBody
public User requestJson04(@RequestBody List<User> list){
User user2 = new User(1, "黄飞鸿","12346",new Date());
System.out.println(list);
return user2;
}
}