OkHttp插件:
github大神写的插件,用于获取网络请求,功能与HttpUrlConnection类似,不过更加简单,因为很多方法都被封装。
Gson插件:
github上大神写的插件,用于json数据的解析,功能与JsonObject功能类似。
实现对以下网址的解析:http://guolin.tech/api/china;
打开网站后的json数据如下:
[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"天津"},{"id":4,"name":"重庆"},{"id":5,"name":"香港"},{"id":6,"name":"澳门"},{"id":7,"name":"台湾"},{"id":8,"name":"黑龙江"},{"id":9,"name":"吉林"},{"id":10,"name":"辽宁"},{"id":11,"name":"内蒙古"},{"id":12,"name":"河北"},{"id":13,"name":"河南"},{"id":14,"name":"山西"},{"id":15,"name":"山东"},{"id":16,"name":"江苏"},{"id":17,"name":"浙江"},{"id":18,"name":"福建"},{"id":19,"name":"江西"},{"id":20,"name":"安徽"},{"id":21,"name":"湖北"},{"id":22,"name":"湖南"},{"id":23,"name":"广东"},{"id":24,"name":"广西"},{"id":25,"name":"海南"},{"id":26,"name":"贵州"},{"id":27,"name":"云南"},{"id":28,"name":"四川"},{"id":29,"name":"西藏"},{"id":30,"name":"陕西"},{"id":31,"name":"宁夏"},{"id":32,"name":"甘肃"},{"id":33,"name":"青海"},{"id":34,"name":"新疆"}]
实例效果展现:
实例实现步骤:
1.首先要添加OkHttp和Gson依赖包
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.google.code.gson:gson:2.7'
2.修改MainActivity布局文件,添加两个按钮:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="android.coolweather2.com.coolweather.MainActivity">
<Button
android:id="@+id/main_show_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="解析json数组"
android:textSize="20sp" />
<Button
android:id="@+id/main_show2_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="解析json对象"
android:textSize="20sp" />
</LinearLayout>
3.创建HttpUtil类,用于获取网络请求
public class HttpUtil {
//创建公共的类和公共地静态方法,可以在需要时直接调用,增加代码的复用性
/**
*
* @param address 需要访问的URL网址
* @param callback 添加回调方法
*/
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
//下面是OkHttp的使用步骤
//首先创建OkHttpClient的对象
OkHttpClient client = new OkHttpClient();
//通过创建Request对象将URL绑定
Request request = new Request.Builder().url(address).build();
//添加回调方法,这样OkHttp的使用就完成了,在需要访问网络时只需要调用这个方法就可以了
client.newCall(request).enqueue(callback);
}
}
4.创建Province实体类,用于gson插件的的使用
public class Province {
//通过前面的网址内容可知json数据就另个键分别为id和name,不过这两个键含义太广,
// 这里我将他们命名为proviceId和provinceName,通过SerializedName来映射
//这用就可以实现将json数据转换成Province对象
@SerializedName("id")
public String provinceId;
@SerializedName("name")
public String provinceName;
public String getProvinceId() {
return provinceId;
}
public void setProvinceId(String provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
}
5.所有工作完成后,现在我们就可以使用OkHttp和gson来实现获取网络json数据了,修改Mainactivity中的代码:
public class MainActivity extends AppCompatActivity {
private Button showJsonArrayBtn;
private String TAG = "MainActivity";
private Button showJsonObjectBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showJsonArrayBtn = findViewById(R.id.main_show_btn);
showJsonObjectBtn = findViewById(R.id.main_show2_btn);
showJsonArrayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用刚才写的获取网络数据的方法,传入url和创建回调方法
HttpUtil.sendOkHttpRequest("http://guolin.tech/api/china", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//获取解析成功网络请求后的字符串,string()方法为gson自带的方法
String responseString = response.body().string();
//当访问网络成功后会执行这一个方法
//下面我们使用gson来接收数据就可以了
//创建gson对象
Gson gson = new Gson();
//下面将json数据与实体类相关联
//因为json数据最外面是[]及json数组,所以我们使用gson解析数组的方法,较为繁琐
//创建list集合,通过TypeToken将希望解析成的数据传入fromJson中
List<Province> provinceList = gson.fromJson(responseString,new TypeToken<List<Province>>(){}.getType());
//这用province中就有了[]中的所有数据,下面遍历就可以了
for(Province province:
provinceList){
Log.e(TAG, "json数组: "+province.getProvinceName());
}
}
});
}
});
showJsonObjectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HttpUtil.sendOkHttpRequest("http://guolin.tech/api/china", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//相比之下,用gson解析jsonobject就简单多了
Gson gson = new Gson();
String responseString2 = response.body().string();
try {
//因为joson数据最外面是[]所以用JSONArray来接收json字符串
JSONArray jsonArray = new JSONArray(responseString2);
//获取第一个jsonobject的数据
String province1 = jsonArray.getJSONObject(0).toString();
//将json数据与实体类相关联
Province province = gson.fromJson(province1,Province.class);
Log.e(TAG, "json对象: "+province.getProvinceName());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
});
}
}
6.最后不要忘了添加访问网络的权限:
<uses-permission android:name="android.permission.INTERNET" />