对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的代码。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 壁纸被烟熏黑了怎么办 空调被烟熏黑了怎么办 牙被烟熏黑了怎么办 尖头鞋把尖折了怎么办 腰椎固定手术钢钉断了怎么办 脚被钢钉扎了怎么办 皮帘子有胶了怎么办 12v插口没有电怎么办 吃了一颗聚乙烯醇怎么办 立式注塑机产品粘膜怎么办 被小松鼠咬了怎么办 被宠物松鼠咬了怎么办 手被松鼠咬出血怎么办 银联认证码失败怎么办 国际汇款触发合规查询怎么办 外面的网线断了怎么办 网线被别的车挂断了怎么办 施工挖断军用光缆怎么办 不小心挖断光缆怎么办 家里的光纤断了怎么办 车被树枝刮花了怎么办 货车撞断了树枝怎么办? 把光缆挖断了怎么办 光缆有外伤断了怎么办 不小心挖断移动光缆怎么办 派克服内胆掉毛怎么办 汉王电纸书怎么无法开机怎么办? 压力喷水壶坏了怎么办 行车记录仪后摄像头不清楚怎么办 蓝牙听歌声音小怎么办 对讲机时灵时不灵怎么办 黑凉粉煮稀了怎么办 轮速传感器坏了怎么办 黑魂3被入侵了怎么办 轮胎螺丝滑牙了怎么办 gta5ol寻宝任务退出了怎么办 gta5线上模式买房子之后怎么办 开摩托车忘记带安全头盔怎么办 gta不想要车了怎么办 空气滤芯进水会怎么办 车胎扎了个钉子怎么办