使用OkHttp和Gson插件实现读取网络JSON数据,实例讲解

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" />
Finished

猜你喜欢

转载自blog.csdn.net/shaochen2015821426/article/details/79930908