对Json与BaseBean的一些理解
来源:互联网 发布:java object 锁 编辑:程序博客网 时间:2024/05/16 01:06
众所周知Json是常用的网络通信的数据格式,Json在google的FlatBuffers出来之前,Json几乎是大家通用的数据传输格式。没有对比就没有伤害,相对于FlatBuffers几乎变态的解析速度来说,Json在大量数据传输的时候确实有一定的劣势,但是Json相对于FlatBuffer的可读性上确实是要更高一些。
常见的Json格式
既然Json是客户端于服务端交互的语法,它也有他自己的一些语法规则(大家可以参考http://www.w3school.com.cn/json/json_syntax.asp)。但是为了开发的方便和避免一些没必要的坑,在这里,我贴上我在项目开发中的常用的语法格式:
1.外层json
{ "status": 0, "message":"访问成功", "data": "" }
这里用到的status用于返回状态吗,message用于返回状态描述,这样可以方便客户端查看到请求失败的具体原因,便于解决问题。data这是用于放置本次请求具体的数据返回。
2.data的内容
data的里面的内容我遇到过的主要分为三种情况。
情况一 data中为字符串:
{ "status": 0, "message":"访问成功", "data": "" }
情况二 data中为对象:
{ "status": 0, "message":"访问成功", "data": {"name":"马云"} }
情况二 data中为数组:
{ "status": 0, "message":"访问成功", "data":[{"name":"马云"},{"name":"马化腾"}] }
BaseBean的初步构想
现在对于Json的使用还有一个方便的地方就是可以用于解析的工具众多,例如google的Gson,它可以根据json自动动态的生成对应的对象。因此当我们拿到Json之后,就可以直接转化为一个Bean对象。那我们应该如果来写这个Bean对象呢?
首先,你可以想到的方法是写一段下面这样的代码:
..... private int status; public void setStatus(int status) { this.status = status; } public int getStatus() { return status; }
根据一个程序员固有的思维,上面既然都有外层Json了,我不用每个Bean都自己写吧,我是不是只需要一个BaseBean,具体的Bean在继承这个BaseBean就可以了。BaseBean代码如下:
public class BaseBean { int status = 0; String message = ""; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }}
这里为什么没有把data写到BaseBean中呢,因为具体的json还可能会根据具体的业务返回不同的结构,所以data的类型也变化的。那怎么解决呢,首先我想到的办法就是对data的类型做一个限制。要求data中返回的数据类型必须是一个对象,这样不就可以把data写到BaseBean中了吗。这样就要求后端返回的Json数据必须是下面这样的格式:
{ "status": 0, "message":"访问成功", "data": {}
看到这里,可能有人要问,为什么我一定要写一个BaseBean呢?这么麻烦,还得和后台确定格式(以前确定这个格式的时候还和后台指手画脚过几次)。这样做的好处在于可以统一的根据json返回做不同的处理。例如status为0时,我可以统一的显示加载错误的界面,统一的显示处理dialog弹窗等。
BaseBean的升级版
考虑到BaseBean对后台还是有一定的格式要求,这样的设计终究不是十分完美。在加上实际开发中有时候还会出现这样的情况:
json 1:{ "status": 0, "message":"访问成功", "data": {"name":"马云"} }json 2:{ "status": 0, "message":"访问成功", "data": {"phone":"110","person":{"name":"马云"}} }
在这种情况下,如果按照以前的思路就必须创建两个Bean来继承BaseBean,而且每个Bean都有name这样的一个属性,这样看来这里也可以优化。前段时间看了XDroid的代码,里面大量用的泛型来做约束,这里,我也用泛型对BaseBean做了部分修改,代码如下:
public class BaseBean<T> { int status = 0;//访问接口返回状态 1--访问成功 0--访问失败 String message = "";//访问成功或者失败的接口表描述 T data = null;//服务器实际返回的数据 private static BaseBean bean; //把实体类作为工具类 public static <T> BaseBean<T> getBean(Class<T> classOfT){ if(bean == null){ bean = new BaseBean<T>(); } return bean; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; }}
具体使用方法如下:
BaseBean<UserBean> resultBean = new BaseBean<UserBean>();
如果有Person这样一个对象,在构建的json对象的时候,可以这样写:
BaseBean<UserBean<Person>> resultBean = new BaseBean<UserBean>();
这样就能最大程度的简化Bean的代码。
- 对Json与BaseBean的一些理解
- 对JSON的理解以及一些应用
- 对session与cookie的一些理解
- 对与顺序表的一些理解
- 对与RestFul的一些理解
- 对java中json格式变量数据的一些理解
- 对json的理解
- 对json的理解
- 对json的理解
- 关于对ajax与json数据的理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- 对html与body的一些研究与理解
- jsp/servlet上传文件
- logstash使用webhdfs插件指定输出字段存储数据到hdfs时间分层(还能保留原来数据)
- 将jdk版本:jdk1.8更换为jdk1.7之后输入java -version还是出现1.8的版本号
- 【POJ 1330】Nearest Common Ancestors(LCA_trajan)
- 关于ubuntu中文件类型没有颜色区分的配置文件修改
- 对Json与BaseBean的一些理解
- python安装第三方库的问题
- PHP echo/print
- Ubuntu 14.04安装JDK1.8.0_25与配置环境变量
- echarts 调整图表 位置 的方法
- Java计算时间,可以像微信朋友圈那样显示发布的时间
- android studio调试安装程序,安装失败,并且手机自动掉线
- Uva 579 Clock Hands
- qt XML文件中node的删除方法