(七) spring boot 接口返回结果封装&&对象json的转换

对于很多时候,都是使用前后端分离的形式来写的接口,所以对于数据返回的规定是必不可少的,在我们日常的开发中这部分的使用还是很必要的

另外一点,在返回参数或者其他业务中,有时候遇到实体和json的转换也是很头疼,所以整合了一下这部分的内容。

接口返回结果封装


添加Result类

在util包中添加类Result

import java.io.Serializable;
import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

/**
 * json结果集
 */
@Data
public class Result implements Serializable {

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 响应业务状态
    private Integer status;

    // 响应消息
    private String msg;

    // 响应中的数据
    private Object data;

    public Result() {
    }

    public Result(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public Result(Object data) {
        this.status = 1;
        this.msg = "OK";
        this.data = data;
    }

    public static Result ok() {
        return new Result(null);
    }

    public static Result ok(Object data) {
        return new Result(data);
    }

    public static Result build(Integer status, String msg) {
        return new Result(status, msg, null);
    }

    public static Result build(Integer status, String msg, Object data) {
        return new Result(status, msg, data);
    }
}

在controller中的修改

主要是对接口的返回值类型做一个修改,并且对返回的参数做一个封装

@RestController
@Api(tags = "用户操作")
public class UserController {
    @Autowired
    private UserDao userDao;

    @GetMapping("/users")
    @ApiOperation(value = "获取用户列表", notes = "获取所有的user信息")
    public Result getUserList() {
        List<User> userList = userDao.getUserList();
        return Result.ok(userList);
    }
}

启动去swagger中测试,发现我们的结果返回已经成了json的形式
在这里插入图片描述
对于Result的引入还是很简单的

Result提供的几个方法

构造方法:

public Result(Integer status, String msg, Object data)
对于200的请求,我们会返回code、msg和data

public Result(Object data)
封装了200返回的请求,data就是返回的数据,为了方便所以封装了这个构造函数

静态方法:

public static Result ok()
不包含返回data的200请求

public static Result ok(Object data)
包含返回data的200请求

扫描二维码关注公众号,回复: 9068277 查看本文章

public static Result build(Integer status, String msg)
使用Result.build来调用,返回值包括status和msg,不需要再去手动实例化

public static Result build(Integer status, String msg, Object data)
使用Result.build来调用,返回值包括status、msg和data,不需要再去手动实例化

对象json的转换

引入json转换的类

在util包中添加JsonUtil类

import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 自定义响应结构
 */
public class JsonUtils {
    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 将对象转换成json字符串。
     *
     * @param data json数据
     * @return
     */
    public static String objectToJson(Object data) {
        try {
            String string = MAPPER.writeValueAsString(data);
            return string;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将json结果集转化为对象
     *
     * @param jsonData json数据
     * @param beanType 对象中的object类型
     * @return
     */
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        try {
            T t = MAPPER.readValue(jsonData, beanType);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将json数据转换成pojo对象list
     *
     * @param jsonData json数据
     * @param beanType 对象中的object类型
     * @return
     */
    public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
        try {
            List<T> list = MAPPER.readValue(jsonData, javaType);
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

添加测试方法

在test包下添加测试类

package com.banana.demo;

import com.banana.demo.entity.User;
import com.banana.demo.util.JsonUtils;
import org.junit.jupiter.api.Test;

import java.util.List;

public class JsonTest {

    @Test
    public void testJson() {
        User user = new User("1", "Banana", "123456");
        String strObject = JsonUtils.objectToJson(user);
        System.out.println(strObject);

        // {"id":"1","user_name":"Banana","user_password":"123456"}
        String userJson = "{\"id\":\"1\",\"user_name\":\"Banana\",\"user_password\":\"123456\"}";
        User user1 = JsonUtils.jsonToPojo(userJson, User.class);
        System.out.println(user1);

        /*
          [
            {"id":"2","user_name":"老王","user_password":"老王的密码"},
            {"id":"3","user_name":"老孙","user_password":"老孙的密码"}
          ]
         */
        String strList = "[\n" +
                "{\"id\":\"2\",\"user_name\":\"老王\",\"user_password\":\"老王的密码\"},\n" +
                "{\"id\":\"3\",\"user_name\":\"老孙\",\"user_password\":\"老孙的密码\"}\n" +
                "]";
        List<User> userList = JsonUtils.jsonToList(strList, User.class);
        System.out.println(userList);

    }
}

结果返回:

{“id”:“1”,“user_name”:“Banana”,“user_password”:“123456”}

User(id=1, user_name=Banana, user_password=123456)

[User(id=2, user_name=老王, user_password=老王的密码), User(id=3, user_name=老孙, user_password=老孙的密码)]

以上测试类只是测试如何使用

参考博客

Java开发:返回结果集Result工具类以及JSONUtil

本系列博客


Banana的SpringBoot系列博客

(一) SpringBoot 项目初始化 + 配置swagger页面

(二) SpringBoot 整合 MyBatis-plus

(三) SpringBoot之使用Swagger配置详解

(四) spring boot 多环境配置

(五) spring boot 配置使用 redis

(六) spring boot 整合rabbitmq 与 rabbitmq使用教程

发布了129 篇原创文章 · 获赞 147 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq1515312832/article/details/103293342
今日推荐