之前的几篇博文中提到过封装网络工具类,那么在发送请求并获取一个JSONObject对象之后,如何便捷的进行json解析和数据存储便成了我们要考虑的问题,在此分享一下自己在使用了诸多工具之后的一点心得。
首先是json解析,我推荐使用Gson自带的一个方法,一行代码就可以获取所有的数据并将数据存储进bean中,下面给出例子:
这是一个很常见的接口返回数据,该接口的格式为{“retcode”,"retmsg","data"},在"data"中有基本数据类型也有Array数据。首先我们要创建两个bean分别用于存储"data"中的数据和"list"中的数据,代码如下:
LessonIndexBean.java:
public class LessonIndexBean {
private int totalcount;//结果总数目
private long searchtime;
private int pn,ps;//第几页,每页有几条
private List<LessonIndexChildBean>list;
public int getTotalcount() {
return totalcount;
}
public void setTotalcount(int totalcount) {
this.totalcount = totalcount;
}
public long getSearchtime() {
return searchtime;
}
public void setSearchtime(long searchtime) {
this.searchtime = searchtime;
}
public int getPn() {
return pn;
}
public void setPn(int pn) {
this.pn = pn;
}
public int getPs() {
return ps;
}
public void setPs(int ps) {
this.ps = ps;
}
public List<LessonIndexChildBean> getList() {
return list;
}
public void setList(List<LessonIndexChildBean> list) {
this.list = list;
}
}
LessonIndexChildBean:
public class LessonIndexChildBean {
private int lessonid;
private String lessonname;
private String imgurl;
private int score;
private int scorecount;// 评分人数
private int hit;
public int getLessonid() {
return lessonid;
}
public void setLessonid(int lessonid) {
this.lessonid = lessonid;
}
public String getLessonname() {
return lessonname;
}
public void setLessonname(String lessonname) {
this.lessonname = lessonname;
}
public String getImgurl() {
return imgurl;
}
public void setImgurl(String imgurl) {
this.imgurl = imgurl;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getScorecount() {
return scorecount;
}
public void setScorecount(int scorecount) {
this.scorecount = scorecount;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
}
不要忘了,为了满足json格式,我们还要创建一个ApiBean,这个Bean适用于同个项目的所有接口:
ApiBean.java:
public class ApiBean<T> {
private int retcode;
private String retmsg;
private T data;
public int getRetcode() {
return retcode;
}
public void setRetcode(int retcode) {
this.retcode = retcode;
}
public String getRetmsg() {
return retmsg;
}
public void setRetmsg(String retmsg) {
this.retmsg = retmsg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
ok,下面只需要用Gson自带的方法就可以通过一行代码把接口返回的JSONObject对象解析并存入上面创立的bean中:
ApiBean<LessonIndexBean>bean = new Gson().fromJson(object+"",new TypeToken<ApiBean<LessonIndexBean>>(){}.getType());
其中object就是接口返回的JSONObject对象,一行代码,所有的数据都存入了实体类中,是不是很方便。
但是有的时候,我们要在其他的界面使用这些数据,光存入实体类中还不够,我们还想把它们存入本地缓存中。当数据量不大的时候,我们可以通过SharedPrefrences来进行存储。不过使用过SharedPrefrences的同学应该会发现,直接使用SharedPrefrences代码量很大,一行代码只能存储一个数据,如何更加快捷的存储这些数据呢?下面我们就通过范式+反射封装一个数据存储工具类:
public class SharedPrefrenceUtil {
public static <T> void setData(Context context, T bean, String beanName) throws IllegalAccessException, IllegalArgumentException, InstantiationException {
SharedPreferences preferences = context.getSharedPreferences(beanName, 0);
Editor editor = preferences.edit();
Class c = bean.getClass();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
switch (field.getType().getSimpleName()) {
case "String":
editor.putString(field.getName(), "" + field.get(bean));
editor.commit();
break;
case "int":
editor.putInt(field.getName(), (int) field.get(bean));
editor.commit();
break;
case "long":
editor.putLong(field.getName(), (long) field.get(bean));
editor.commit();
break;
}
}
}
}
通过反射的方式遍历输入的bean中的所有变量,再根据变量的不同类型进行不同的存储操作,上面的封装类里只有String,int,long三种类型,我们可以自己往里面添加不同的类型,比如float,double等等,在此就不进行赘述了。
结合之前封装的网络工具类,往往我们只要写四五行代码就可以对一个接口进行数据读取,存储,缓存至本地等一系列操作了,代码量节省了不知道多少!