JSON工具类的构建(后端版本)
前言
在前后端交互的选择上,之前一直采用的是模板引擎(因为我只负责后端)。
而这次的一个算是作业吧,前后端都是我,所以就研究了一下JSON交互在java web的应用(主要是前端)。
优缺点
前后端耦合
- 模板引擎加载只是将jsp的交互方式移植到html上,前端文件格式改变了,但是jsp中前后端耦合的缺点没有改变。
- json交互中,数据通过js/jquery动态加载在页面上,数据与页面进行分离,页面只是单纯用于展示。
数据加载逻辑复用
- 模板引擎的方式中,如果有很多相似的页面元素以及一样的数据返回格式,那只是复制粘贴大法了。
- 在模板引擎的例子中,只需要定义一套数据加载模型,传入不同的页面元素id以及数据则能实现逻辑复用
后端接口的复用
因为我的学习路线的问题,所以我开发过安卓原生一段时间。- 模板引擎式的加载必须使用webView组件加载,且需另进行原生构建时接口也要另外构建。
- json交互,谷歌爸爸鼓励使用json进行交互(一年多前的事,现在不清楚了),且安卓原生内置GJSON进行json解析与构建,所以可以在原生以及跨平台的构建有很好的平衡。
对比
既然选择了json交互的方式,而java官方据我所知是没有内置对json的支持,Spring在Controller的层面使用RestContrller注解实现对json的支持。
但是我个人强迫症很强,我对Contrller(或者说是Presenter)的定义是
- 对用户访问的url作页面的映射
- 对用户触发的事件进行数据的传递与返回
正是这两点的定义,我需要在Service层组合统一格式的结果返回到上层,所以需要第三方json支持。
可选择的JSON库有很多,GSON,FastJson,Jackson,根据对比,我选择为马老师充值一波。
需求拆分
我初步定义的需求主要有三个
- Service传递统一处理结果到上层
- 无论是单一数据实体或者List型数据处理的结果是一样的
- 处理过程是独立的,不依赖于实体类的支持
格式设计
在网上看过很多后端返回数据的格式,很多都是返回一个处理的status以及具体的数据,而这个status是根据http状态码进行设定的,因为这次时间比较紧,所以我就采用了这个方案。
{
"status": "status",
"object": {
}
}
代码设计
因为我希望Controller能直接拿到结果,所以构建结果的过程全放在Result类中。
而结果构建我主要分为两种:只有状态码(通知处理结果)以及具有返回结果(数据显示),而根据结果的个人也分为两种:单个数据以及List型数据。
实际代码
@Getter
@Slf4j
public class ResultSet {
private JSONObject result;
public ResultSet(){
result=new JSONObject();
}
/**
* 初始化状态码
* @param status
*/
public void initStatus(String status){
result.put("status", status);
}
/**
* 初始化状态码以及返回数据
* @param status
* @param obj
*/
public void initData(String status,Object obj){
initStatus(status);
if(obj instanceof List){
List list=(List)obj;
JSONArray array=new JSONArray();
for(Object object:list){
array.add(putObjectToJSON(object));
}
result.put("object",array);
}
else {
result.put("object",putObjectToJSON(obj));
}
}
/**
* 将单个Object放入json文件中
* @param obj
* @return
*/
private JSONObject putObjectToJSON(Object obj){
JSONObject result=new JSONObject();
Field[] fields=obj.getClass().getDeclaredFields();
for(Field field:fields){
field.setAccessible(true);
String fieldName=field.getType().getSimpleName();
if(fieldName.equals("Department")||fieldName.equals("Job")){
JSONObject tempJson=new JSONObject();
try {
Object tempObject = field.get(obj);
Field[] tempFields=tempObject.getClass().getDeclaredFields();
for(Field tempField:tempFields){
tempField.setAccessible(true);
tempJson.put(tempField.getName(),tempField.get(tempObject));
tempField.setAccessible(false);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if(fieldName.equals("Department")){
result.put("depart",tempJson);
}
else {
result.put("job",tempJson);
}
}
else {
try {
result.put(field.getName(),field.get(obj));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
field.setAccessible(false);
}
return result;
}
}
代码思路
Service通过initStatus/initData传入数据/状态码进行对象的生成
Controller通过result的getter方法获取处理结果
单个数据以及List数据的处理
- 单个对象直接通过putObjectToJSON进行处理
- List数据通过对象类型判断,向下转型,遍历元素形成JSONArray进行处理,对元素处理的方法也是采用putObjectToJSON
嵌套对象的处理
public class Employee { private int id; private Department depart; private Job job; private String name; ..................
}
- 通过反射获取对象的所有成员变量类型以及对应的值
- 遇到上述bean类含有嵌套自定义对象时,递归生成json文件加入到结果json中
结果演示
(左为单object型,右为List型)
不足之处
- 状态码的设置应该采用枚举类的赋值,能更好的约束返回的状态码
- 在对象转换方面,应该采用配置扫描的方式。在配置文件中写入bean的包所在,在嵌套对象转换时通过扫描配置文件的信息判断
- 在嵌套对象的转换方面,只是做了一层的嵌套转换,更多层的没有考虑到,之后会再重构的
- 对异常处理方面,只是简单的输出错误信息。应该对错误信息进行进一步的处理
后记
因为这次时间比较赶,从项目的立项到成品的建立花了5天时间,所以注意到很多细节,但是没有去处理。
有想过之后有时间的话将这个工具类的细节完善起来,形成jar包供自己或者供开源。
相关连接
这只是后台对结果的统一处理,我另外写了一篇文章:JSON工具类的构建(前端版本),配合使用效果更佳哦~
本文首发于cartoon的博客
转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/json/json工具类的构建后端版本/
JSON工具类的构建(后端版本)的更多相关文章
- JSON工具类的构建(前端版本)
前言 在前后端交互的选择上,之前一直采用的是模板引擎(因为我只负责后端). 而这次的一个算是作业吧,前后端都是我,所以就研究了一下JSON交互在java web的应用(主要是前端). 优缺点 因为我是 ...
- Spring统一返回Json工具类,带分页信息
前言: 项目做前后端分离时,我们会经常提供Json数据给前端,如果有一个统一的Json格式返回工具类,那么将大大提高开发效率和减低沟通成本. 此Json响应工具类,支持带分页信息,支持泛型,支持Htt ...
- 用jackson封装的JSON工具类
package hjp.smart4j.framework.util; import com.fasterxml.jackson.databind.ObjectMapper; import org.s ...
- Code片段 : .properties属性文件操作工具类 & JSON工具类
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...
- Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加
package com.aherp.framework.util; import java.lang.reflect.Array;import java.lang.reflect.Method;imp ...
- Json工具类 - JsonUtils.java
Json工具类,提供Json与对象之间的转换. 源码如下:(点击下载 - JsonUtils.java . gson-2.2.4.jar ) import java.lang.reflect.Type ...
- Java json工具类,jackson工具类,ObjectMapper工具类
Java json工具类,jackson工具类,ObjectMapper工具类 >>>>>>>>>>>>>>> ...
- 强大的Java Json工具类
转自: https://blog.csdn.net/u014676619/article/details/49624165 import java.io.BufferedReader; import ...
- HttpClientUntils工具类的使用测试及注意事项(包括我改进的工具类和Controller端的注意事项【附 Json 工具类】)
HttpClient工具类(我改过): package com.taotao.httpclient; import java.io.IOException; import java.net.URI; ...
随机推荐
- QTP使用Smtp协议发送邮件
NameSpace = "http://schemas.microsoft.com/cdo/configuration/" Set Email = CreateObject(&qu ...
- Java程序的设计环境配置
一.下载主要的开发工具 JDK的下载 www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Ecli ...
- Apache Shiro 集成Spring(二)
1.依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cor ...
- C#读取Xml中出现”&”等特殊符号
原文:C#读取Xml中出现"&"等特殊符号 C#读取Xml中出现的特殊符号时用ASCII或者转定义名称代替.程序读进来后转成字符串后就自动变成相应的字符了,再度保存时会以正 ...
- 【目录】mysql 架构篇系列
随笔分类 - mysql 架构篇系列 mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制) 摘要: 一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在 ...
- form 表单的name
form 中 的name 很重要, 1. 可以用来查找对应的input 2.form 提交之后 会用来作为参数列表的名字 3.enovia plm 中,name 会和 table 的field 进行对 ...
- 创建Uboot 环境变量 bin 文件
As we know, the bootloader stores its configuration into an area of the flash called the environment ...
- AD中快速按模块摆放器件
AD中快速按模块摆放器件 在PCB布局的过程中,我们需要将元器件按照功能模块进行放置,如果一个一个去寻找则很麻烦,现在介绍一个快捷的方法: 1.首先在原理图中按照模块选中,然后快捷键 T+S跳转到PC ...
- String 字符串和StringBuffer的知识点总结
String字符串 1 字符串.equals(); equals和length的区别:equals ...
- 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。
可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...