Sprint Boot 系列(三)返回 Json 数据

Spring Boot返回JSON的方式

Spring Boot返回Json的方式有好几种,比如:

1.使用响应Response的方式像终端写数据

2.直接将数据封装为Json的字符串方式返回

3.直接将对象返回

一、以Response形式写Json数据

首先我们先创建一个User类,用来放我们要返回的数据。

package online.yangcloud.model;

public class User {

    private String username;
    private String password;

}

我们的这个User类里就两个字段,一个用户名username,一个密码password,这里我就不进行加密了,只是将数据展示一下。这里注意一点,实体类别忘加gettersetter方法。

实体类创建好了之后,我们创建一个controller,用于编写我们的接口

@RestController
@RequestMapping("/json")
public class JsonController {
}

可以看到,我创建了一个JsonController,我们本篇文章编写的接口,就要都写在这里面。

那么,我们可以先编写第一个接口,用Response响应向请求端写入数据的方式去返回Json

@GetMapping("/response")
public void writeResponse(HttpServletResponse response) throws IOException {
    User user = new User();
    user.setUsername("zhangsan");
    user.setPassword("123456");
    response.getWriter().write(JSONUtil.toJsonStr(user));
}

我们用GetMapping()的方式,去声明了一个接口,接口的请求方式为get方式。同时,参数是HttpServletResponse,由于我们没有任务的业务,所以只需要这一个参数即可。

接着就用到我们上面创建的实体类User了,我们给了一个人的信息,姓名叫“张三”,密码是”123456“。

response进行返回的话,要先获取到PrintWriter,然后再用PrintWriter写数据。那么这个getWriter()方法,返回的就是一个PrintWriter

20220916212224image.png

那么,有了PrintWriter后,我们就可以调用write()方法去写数据了。

20220916214610image.png

可以看到,write()方法有5种,这里我们用第二种,也就是将字符串传进去即可。同时,小伙伴注意到了么,5个方法的返回值都是void,这就是为什么我们在定义接口的时候,也是用void去定义的返回值。至于JSONUtil.toJsonStr()这段,是因为我使用了Hutool工具,将类转为JSON字符串。

那么,我们可以启动起来,看一下效果。

20220916215300image.png

那么结果,也可以看到了,我们通过浏览器访问接口,成功将返回值打印出来。不过小伙伴们可能看到的效果和我的不太一样,我安装了一个浏览器的插件,叫JSONVue,是将Json格式化后打印出来的。

二、以字符串形式返回Json数据

接下来,我们来说第二种方式。

其实,这种方式与第一种方式大同小异,只不过是将字符串直接返回,而不是通过Response了而已。

我们直接编写接口

    @GetMapping("/string")
    public String returnString() {
        User user = new User();
        user.setUsername("lisi");
        user.setPassword("1");
        return JSONUtil.toJsonStr(user);
    }

这里只简单说一下与上一种方式的区别。

1.不需要将Response当做入参。

2.需要将方法的返回值定义为String类型。

3.方法直接return字符串

其他的不需要多说什么了。直接看效果。

20220916220623image.png

可以看到,这种方式,我们也通过浏览器访问接口,接收到了数据。

三、以对象形式返回Json数据

这一种方式呢,跟第二种差不多。只不过,第二种是返回String类型,这种是返回Object类型。为什么是Object类型呢,因为你不能确定返回的数据是什么类型的,所以直接用所有类的顶类Object类来定义就可以了。那么既然返回值可以是任意一种类型的话,我们也就没有必要将实体类转为字符串,再返回了,可以直接返回了。

接口内容改为这样。

    @GetMapping("/obj")
    public Object returnObj() {
        User user = new User();
        user.setUsername("wangwu");
        user.setPassword("2");
        return user;
    }

这里不多做解释,上面都已经解释完了。

直接看效果;

20220916221103image.png

同样,数据接收到了,没有问题。

那么,到这里,本篇文章也就结束了。

未完待续~~

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×