之前的时候看过很多的博客对于json数据进行解析,今天有时间自己亲自对json数据的解析做了练习,在这里分享自己的练习过程中的一些小问题,希望可以帮助到更多的人
这个是我需要请求的json数据,其中我们需要解析的字段是“tracks”字段
我们来简单的分析一下这个数据,从这个地方我们可以看出需要解析的字段是一个集合,集合里面有很多的对象,这里我们使用的GSON的序列化的方式来解析我们获取到的json数据
compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.okhttp3:okhttp:3.1.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' 这里我们用到的是三个库Retrofit依赖库,OKhttp依赖库,还有就是Gson的依赖库。
创建一个接收解析对象的类也就是我们通过这个json文件分析出来的类对象,由于我们这里现要求只解析tracks字段所以我们这里对于类的创建也就是简单的基于这样的一个简单的原则,这个我会在以后重点分析Gson解析json数据的时候对于这里的这个问题做进一步的分析。
这个是对tracks字段的定义(注意这里我们使用的是类外定义的方式没有用定义内部类的方式)
public class Tracks { private int Tid; private String title; public int getTid() { return Tid; } public void setTid(int tid) { Tid = tid; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } 外层对象的Java类
public class MusicItem { private List<Tracks> tracks; public List<Tracks> getTracks() { return tracks; } public void setTracks(List<Tracks> tracks) { this.tracks = tracks; } }
public interface Getrequest_Interface { //http://v5.pc.duomi.com/search-ajaxsearch-searchall?kw=二胡&pi=1&pz=10 /** * 通过配置文件的形式来配置get请求的参数 * @return 返回值表示请求到的数据 */ //@GET("ajax.php?a=fy&f=auto&t=auto&w=hello world") @GET("search-ajaxsearch-searchall?") Call<MusicItem> getCall(@Query("kw") String kw,@Query("pi") int pi,@Query("pz") int pz); // 注解里传入 网络请求 的部分URL地址 // Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里 // 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略 // getCall()是接受网络请求数据的方法 }
这里我做的GET请求是有参数的,所以在请求的时候我们使用到了Retrofit的参数配置的方式来设计这个接口
由于这三步在开发的时候是比较密切的,所以我们可以使用封装一个函数的方式来实现这些东西
public void request() { //步骤4:创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() //.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url .baseUrl("http://v5.pc.duomi.com/") .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖) .build(); // 步骤5:创建 网络请求接口 的实例 Getrequest_Interface request = retrofit.create(Getrequest_Interface.class); //对 发送请求 进行封装 Call<MusicItem> call = request.getCall("二胡",1,10); //步骤6:发送网络请求(异步) call.enqueue(new Callback<MusicItem>() { //请求成功时回调 @Override public void onResponse(Call<MusicItem> call, Response<MusicItem> response) { // 步骤7:处理返回的数据结果 //response.body().toString(); //System.out.println(response.body().getTracks().get(0).getTitle()); for (Tracks tracks: response.body().getTracks()) { System.out.println(tracks.getTitle()); } } //请求失败时回调 @Override public void onFailure(Call<MusicItem> call, Throwable throwable) { System.out.println("连接失败"); } }); }
对于方法里面的参数在方法中我已经说的很清楚了所以在这里我就不再啰嗦了,这里在我配置开发时候对于数据的处理是有一点小小的问题,这里需要注意的一点就是你所要请求的参数的设置,在Retrofit中是通过注释的方式来配置我们的请求方式,所以就存在一个问题参数匹配的问题,我们要按照相应的规则对于我们的参数进行请求,这样就可以很好的保证数据的完整性。对于参数的设置问题,我们要更具实际的开发选择相应的数据进行展示。
最后简单的输出效果就是这个样子的