java 接口返回json数据封装

2023-11-08

前言

首先,采用的是springboot,在controller中使用了@RestController或者@ResponseBody注解,返回的数据本身就是json格式。但是这样的json串在前后端分离使用中并不满足实际的效果,因此需要进行相应的封装,以满足前端能够正确处理获取的数据。

一、准备

1.1 使用的是fastjson,因此需要pom文件引入包

版本随你

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.58</version>
</dependency>

1.2 统一的返回规范必不可少

一般情况下,状态、信息、数据这三项已经满足大部分需要。如果需求特殊可以自己修改。
序列化
值得说一下的是重写tostring时就将其转换为json串JSON.toJSONString(this);。本文所用的返回类进行了实例化,因此采用JSON.方法,也可以通过JSONObject(已经实现序列化,返回类不需要再次序列化)的方发进行转换。
在这里插入图片描述
为空处理
利用fastjson自带的注解来处理返回时无值得情况,统一显示为null。@JSONField(serialzeFeatures = {SerializerFeature.WriteMapNullValue})

import java.io.Serializable;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 
 * @Description: 统一API响应结果封装
 * @author ZhiPengyu
 * @date: 2020年4月29日 下午2:48:18
 */
public class ResponseBody implements Serializable {
 
    /**
	 * 
	 */
	private static final long serialVersionUID = 1886106011131539131L;
	
	private String code;
    private String message;
    @JSONField(serialzeFeatures = {SerializerFeature.WriteMapNullValue})
    private Object data;
    
	/* set and get */
    public String getCode() {
        return code;
    }
 
    public void setCode(String code) {
        this.code = code;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
 
    public Object getData() {
        return data;
    }
 
    public void setData(Object data) {
        this.data = data;
    }
    
	/* 构造 */
    public ResponseBody() {
		super();
		// TODO Auto-generated constructor stub
	}

    public ResponseBody(String code, String message, Object data) {
		super();
		this.code = code;
		this.message = message;
		this.data = data;
	}

	/**
     * 默认成功或者失败,无数据
     * @param resultCode
     */
	public ResponseBody(ResultCode resultCode) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
    }
	
	/**
	 * 枚举结果以及获取数据
	 * @param resultCode
	 * @param data
	 */
	public ResponseBody(ResultCode resultCode,String message) {
        this.code = resultCode.getCode();
        this.message = message;
    }
	
	/**
	 * 枚举结果以及获取数据
	 * @param resultCode
	 * @param data
	 */
	public ResponseBody(ResultCode resultCode,Object data) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.data = data;
    }
	
	@Override
	public String toString() {
		return JSON.toJSONString(this);
	}

}

二、封装

为了更好的进行操作,将操作细节隐藏封装。

2.1枚举

就是状态码的统一操作,这样是更加规范的,对前端也一样。

/**
 * 
 * @Description: 响应码枚举,参考HTTP状态码的语义
 * @author ZhiPengyu
 * @date: 2020年4月29日 上午9:27:40
 */
public enum ResultCode {
    /* 成功 */
    SUCCESS("200", "Success!"),
    /* 失败 */
    FAIL("400", "Failure!"),
    
	/* 参考HTTP状态码 */
    NO_PERMISSION("403", "Need Authorities!"),//没有权限
    LOGIN_NO("402", "Need Login!"),//未登录
    LOGIN_FAIL("401", "Login Failure!"),//登录失败
    LOGIN_SUCCESS("200", "Login Success!"),//登录成功
    LOGOUT_SUCCESS("200", "Logout Success!"),//退出登录
    SESSION_EXPIRES("101", "Session Expires!"),//会话到期
    SESSION_EXPIRES_OTHER_LOGIN("101", "Session Expires!Other users login!"),//会话到期,其他用户登录
    
    
    private String code;
    private String message;
    
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

	/**
	 * 
	 * @param code
	 * @param message
	 */
    ResultCode(String code, String message) {
        this.code = code;
        this.message = message;
    }

}

2.2封装

利用**@Component**注解简化用户在返回数据是复杂复制操作,同时减少自定义的使用,以枚举为主,可以不断添加。

import org.springframework.stereotype.Component;

@Component
public class ResultGenerator{

	/**
	 * 默认成功,无数据
	 * @return
	 */
	public ResponseBody getSuccessResult() {
        return new ResponseBody(ResultCode.SUCCESS);
    }
	/**
	 * 默认成功,有数据
	 * @param data
	 * @return
	 */
	public ResponseBody getSuccessResult(Object data) {
        return new ResponseBody(ResultCode.SUCCESS,data);
    }
	/**
	 * 默认失败,无数据
	 * @return
	 */
	public ResponseBody getFailResult() {
        return new ResponseBody(ResultCode.FAIL);
    }
	/**
	 * 默认失败
	 * @param message 自定义失败信息
	 * @return
	 */
	public ResponseBody getFailResult(String message) {
        return new ResponseBody(ResultCode.FAIL,message);
    }
	
	/**
	 * 采用枚举中的状态无数据返回
	 * @param resultCode 响应码枚举
	 * @param data
	 * @return
	 */
	public ResponseBody getFreeResult(ResultCode resultCode) {
        return new ResponseBody(resultCode);
    }
	
	/**
	 * 采用枚举中的状态带数据返回
	 * @param resultCode 响应码枚举
	 * @param data
	 * @return
	 */
	public ResponseBody getFreeResult(ResultCode resultCode, Object data) {
        return new ResponseBody(resultCode, data);
    }

	/**
	 * 自定义返回信息
	 * @param code 响应码
	 * @param message 自定义失败信息
	 * @param data
	 * @return
	 */
	public ResponseBody getFreeResult(String code, String message, Object data) {
        return new ResponseBody(code, message, data);
    }

}

三、使用

以往都是在controller进行new操作同时,此时可以通过**@Autowired**注解调用并直接赋值返回。
在这里插入图片描述
如上图所示,通过不同的方式进行对比。

3.1未完全封装

@PreAuthorize("hasRole('ROLE_admin')")
	@RequestMapping(value = "getSysUserAdmin")
	public ResponseBody getSysUserAdmin() {
		ResponseBody responseBody = new ResponseBody();
	    responseBody.setCode("200");
	    responseBody.setMessage("Sccess!");
		List<SysUser> sysUser = sysUserService.select(null, null);
		responseBody.setData(JSON.toJSONString(sysUser));
		
		return responseBody;
	}
{
    "code": "200",
    "message": "Sccess!",
    "data": "[{\"company\":\"科研诚信\",\"createtime\":1586942036000,\"parentName\":\"admin\",\"password\":\"$2a$10$XlftNY9T52IbLlVAT6Nx7ezyYlcSFkVzC.3n3h5jihyzo1g/KtAPa\",\"pwdRole\":1,\"role\":2,\"status\":1,\"uploadAmount\":3,\"uploadResidue\":0,\"userId\":27,\"userIp\":\"89\",\"username\":\"admin1\"}]"
}

3.2完全封装

可以看出差距还是不小的。

@Autowired
	ResultGenerator resultGenerator;

	@RequestMapping(value = "testjson")
	public ResponseBody testjson() {
		List<SysUser> sysUser = sysUserService.selectSysUserByUnameOrCompany(null, null);
		return resultGenerator.getSuccessResult(sysUser);
	}
{
    "code": "200",
    "message": "Success!",
    "data": [
        {
            "userId": 27,
            "username": "admin1",
            "password": "$2a$10$XlftNY9T52IbLlVAT6Nx7ezyYlcSFkVzC.3n3h5jihyzo1g/KtAPa",
            "parentName": "admin",
            "company": "科研诚信",
            "cpyBranch": null,
            "userIp": "89",
            "uploadAmount": 3,
            "uploadResidue": 0,
            "status": 1,
            "role": 2,
            "pwdRole": 1,
            "createtime": "2020-04-15T09:13:56.000+0000",
            "startTime": null,
            "endTime": null,
            "phoneNumber": null,
            "mail": null,
            "remark": null
        }
    ]
}

四、总结

此文是在查看一些文章之后的总结修改,大同小异,方式多种多样。再次仅说了一种,那些地方说不不对,还请留言矫正啊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 接口返回json数据封装 的相关文章

随机推荐

  • vue打印props的值_vue props传值失败 输出undefined的解决方法

    如果在prop中传的值为一个没有使用特殊命名规则的变量如 type 可以顺利传值 而当这个变量为驼峰命名法如 selectName 就会传不过去 解决方法是把selectName标签改为select Name 我是按钮 selectName
  • 关于lcm,gcd的一些性质

    两个整数a b 他们的最大公约数为n 最小公倍数为m 则有 a b都能分解为有限个素数的积 12 2 2 3 1 5 0 30 2 1 3 1 5 1 n为a b所有素因子取较小指数的积 n 2 1 3 1 5 0 6 m为a b所有素因子
  • Win平台高精度Sleep实现

    获取时间戳 GetTickCount Windows平台 可通过GetTickCount和GetTickCount64获取时间戳 它们底层实现是一样的 返回值的位宽不同 GetTickCount返回uint32 t 最大值2 32 单位毫秒
  • OpenCV Python 系列教程2 - OpenCV 的 GUI 特性

    图像入门 学习目标 图像的读取 显示 保存 学习三个函数 cv2 imread cv2 imshow cv2 imwrite 使用 Matplotlib 来显示图像 导入常用包 matplotlib notebook import nump
  • C++ 调用Qml方法

    前言 在Qml和QWidget混合开发中 少不了C 与qml的互相调用 之前总结了一下在qml中调用c 的方法 那反过来如何在业务逻辑中直接修改qml呢 qml调用c 总结 QML和QWidget混合开发 初探 添Qml调用C 方法之自定义
  • IMX6学习记录(9)-实现网络连接,rz/sz文件传输

    上面是我的微信和QQ群 欢迎新朋友的加入 现在我已经自己编译过uboot kernel和rootfs了 遇到一个比较麻烦的事情 拷贝文件需要插拔SD卡 考虑的之后开发的便捷性 准备实现rz sz方式的数据传输 1 修改内核配置 把设备树和默
  • 错误处理--CUDA error: device-side assert triggered(很有效)

    embeding中词的总数设小了 在函数 nn Embedding vocab size embedding dimension 中 参数vocab size 为你字典的总词数 如果在训练中有编号 gt len 字典 的数字出现 就会报这个
  • 服务器怎么打开万向系统,全程监控系统解决方案-20210731072231.doc-原创力文档

    全程监控系统解决方案 全程监控系统解决方案 全程监控系统解决方案 呼集老高速公路 全程监控系统解决方案 二零一零年一月 目录一 需求剖析 错误 不决义书签 二 系统设计方案 错误 不决义书签 系统规划 错误 不决义书签 全程无盲点监控和视频
  • Jira插件安装

    一 Jira插件列表 可以将下面免费插件直接下载 然后登陆jira 在 插件管理 gt 上传插件 将下载后的免费插件直接进行上传安装即可 序号 插件名称 功能概要 供应商 资源 100用户报价 1 GreenHopper 敏捷项目管理 At
  • elasticsearch集群正确关闭、重启方式

    问题原因 在elasticsearch集群中 当集群发现某个节点关闭时 将延迟一分钟后 默认 再开始将该节点上的分片复制到集群中的其他节点 这可能涉及很多I O 由于该节点不久将要重新启动 因此该I O是不必要的 您可以通过在关闭节点之前禁
  • 【博客705】chatgpt:编写日志rotate框架

    chatgpt 编写日志rotate框架 场景 我们的网关服务等为了持久化日志以供排查问题 往往将日志输出到文件 此时如果文件太大 可能导致磁盘被写满 此时就需要对日志文件进行rotate 以保存最新的日志 实现 package main
  • Pytorch中计算自己模型的FLOPs

    转自 Pytorch中计算自己模型的FLOPs thop profile 方法 yolov5s 网络模型参数量 计算量统计 墨理学AI CSDN博客 Pytorch 用thop计算pytorch模型的FLOPs 简书 安装thop pip
  • gcc/gdb/gprof/gcov/valgrind使用

    gcc gdb gprof gcov valgrind使用 ning 发表于 2012年10月05日 23 44 Hits 796 Tag all Table of Contents gcc编译带符号 gdb 启动参数 gdb 查看结构体
  • Blender基础:几何节点修改器

    1 几何节点修改器 几何节点修改器Geometry Node Editor 本质上一种自定义修改器 2 节点的添加 添加节点 节点Node 代表一个函数 功能 演示 添加一个节点 几何数据 变换 连接端口 修改节点的参数 几何节点修改器 是
  • ssh端口转发禁用

    配置1 vi etc ssh sshd config 修改内容 AllowTcpForwarding yes GatewayPorts yes 生效 etc rc d init d sshd restart 配置2 vi etc sysct
  • react中使用useMemo和useCallback

    之前学到的memo是用来优化函数组件的重渲染问题 当传入的属性值都没变化时就不会触发组件的重渲染 否则组件就会重渲染 和类组件中的PureComponent组件是类似 useMemo功能是判断组件中的函数逻辑是否重新执行 用来优化性能 im
  • LUA中的and与or

    逻辑运算符认为false和nil是假 false 其他为真 0也是true and的优先级比or高 其它语言中的and表示两者都为真的时候 才返回为真 而只要有一个假 都返回假 lua虽不仅返回假的语义 还返回导致假的值 也就是说 a an
  • webbench 压力测试软件

    1 安装 wget http home tiscali cz cz210552 distfiles webbench 1 5 tar gz tar xzvf webbench 1 5 tar gz cd webbench 1 5 make
  • Ubuntu Linux输入法fcitx方块乱码解决设置

    Ubuntu Linux 10 04自带的输入法不是很好用 linux下的输入法和windows下的比起来还是有很大差距的 相对来说比较好的输入法我看还是fcitx还不 错 不过在Ubuntu下通过 sudo apt get install
  • java 接口返回json数据封装

    前言 首先 采用的是springboot 在controller中使用了 RestController或者 ResponseBody注解 返回的数据本身就是json格式 但是这样的json串在前后端分离使用中并不满足实际的效果 因此需要进行