SpringMVC基于注解使用:JSON处理

334 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

一、javaBean和Json的对比

java转换为json 的过程一般会称为 “序列化”

json转换为java 的过程一般会称为 “反序列化”

Json的属和字符串值 必须要用双引号“” 不能用单引号

JavaJson
String"xxx"
Integer123
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、测试

image.png

2-3、使用@RestController的方式返回json

@RestController注解是放到类上,就都按照Json的方式返回,不论视图解析器是否能解析到,相当于所有的方法都加上@ResponseBody注解 image.png

三、返回Json数据的过滤

我们一般查询用户信息,是不希望把一些隐私信息也回传给前端的,比如密码。

我们可以将User 对象放到map中,这样我们只需要把需要给前端的属性放到map中,然后返回map即可,但是这样太繁琐了,Json给我们提供了更加便捷的方式。

可以看到不仅密码显示出来了,日期也显示的格式不是我们想要的。 image.png

3-1、使用Json注解

@JsonIgnore :Json序列化时,忽略这个属性 @JsonFormart:将属性进行格式化

@JsonIgnore
private String password;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;

3-2、测试

可以看到,密码已经不可见,并且日期已经安装yyyy-MM-dd的方式格式化了。 image.png

四、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;

    }
}

4-2、测试

4-2-1、单个值

image.png

4-2-2、java对象

image.png

4-2-3、Map数据

image.png

4-2-4、List数据

image.png