本文重点讲解在Retrofit2.0中如何讲比较复杂的JSON对象转化为javaBean,而不过多介绍Retrofit2.0的用法,因为讲解Retrofit2.0的文章已经有很多人写了,也写的很详细,我作为一个初用Retrofit2.0的新手,便不班门弄斧了,写这篇文章的主要目的是因为自己在使用的过程中遇到了一些小问题在多方查找下得已解决,因为网上资料比较散,所以在此做个小小的总结。
如今的Android开发中,JSON应该是最主流的数据传输格式了,最简单的一个JSON形式就是这个样子的:
{"key":value}
但理想是丰满的,实际工作中所遇到的JSON有时会比较复杂,下面看一个:
{ "data": { "bzList": [ { "lxbz": "图书馆-归还借用书籍", "zt": "通过" }, { "lxbz": "图书馆-领用教材结算", "zt": "通过" }, { "lxbz": "学生处-助学贷款学生还款确认", "zt": "通过" }, { "lxbz": "学院-发毕业证书", "zt": "未审核" }, { "lxbz": "学院-实习手册、实习综合理论考", "zt": "通过" }, { "lxbz": "教务处-成绩", "zt": "不通过" }, { "lxbz": "财务处-结算学杂费", "zt": "通过" } ], "bjmc": "护理1班", "xm": "张三", "xbmc": "男性", "bmmc": "护理系", "zymc": "护理", "id": 119 }, "success": true }
这个JSONObject中包含着第二层的JSONObject,第二层的JSONObject中又包含着JSONArray,那么对于这种JSON,我们该如何创建对应的javaBean呢。
对于最外层的JSON,我们可以创建一个类Base(名字瞎取得,不喜勿喷>
public class Base{ public boolean success; public Data data; } interface WXTApi{ @GET("/ifeilu-school/commInterface/{owner}") Call
我们看到"data"这个key所包含的又是一个JSONObject,那么我们可以创建一个类叫Data:
public class Data { public List
其中List
public class BzList { public String lxbz; public String zt;}
到此这个JSON的javaBean就创建好了。
写到这里发现标题写的Retrofit2.0,但是貌似内容与其关联不大。为了不让大家留下口舌,那就随便介绍下Retrofit2.0最基本的get请求吧。
首先贴上上述JSON的接口地址:
"http://wxt.zjmc.edu.cn/ifeilu-school/commInterface/getStudentLx?sessionId=ff0766abcc9888d618a629630a42cd07"
那么怎么通过使用Retrofit2.0去请求这个地址呢?
在Base类中我们定义了个WXTApi的接口,通过@GET注解标识为get请求,@GET中所填写的value和baseUrl组成完整的路径,接口中定了一个getFeed方法@Path为动态路径替换,会替换@GET中的{owner},@Query为动态查询参数,其值构成”?sessionId=ff0766abcc9888d618a629630a42cd07“部分。
接下来创建Retrofit2的实例,并设置BaseUrl,因为我们获取到的数据是json格式的,所以我们可以用Gson转换。
Retrofit retrofit = new Retrofit .Builder() .baseUrl("http://wxt.zjmc.edu.cn") .addConverterFactory(GsonConverterFactory.create()) .build();
创建请求服务,并为网络请求方法设置参数
WXTApi wxtApi = retrofit.create(WXTApi.class); Call< Base>call = wxtApi.getFeed("getStudentLx", "ff0766abcc9888d618a629630a42cd07");
其中在getFeed方法中我们传入的参数与baseUrl就组成了我们完整的访问路径。
最后我们就可以对我们拿到的数据进行逻辑处理了
call.enqueue(new Callback< Base>() { @Override public void onResponse(Response response, Retrofit retrofit) { List