Android數據解析技術之JSONObject以及GSON應用實例

前言

1.解析JSON數據可以使用官方提供的JSONObject,也可以使用谷歌的開源庫GSON。

2.以下兩個實例均用到了Android網絡技術中的OkHttp,OkHttp具體使用可參考鏈接: Android網絡技術之HttpURLConnection及OkHttp簡單實例.

3.在解析數據之前還要搭建Web服務器,在服務器上創建JSON數據源,用來被解析:
工程結構:
在這裏插入圖片描述
數據源:
在這裏插入圖片描述
瀏覽器訪問地址:http://localhost:8080/AndroidServer/testData.json

成功顯示數據即爲搭建服務器成功:
在這裏插入圖片描述
4.一定要保證Android studio自帶的模擬器或者其它模擬器能夠訪問Web服務器,具體可參考: Android studio使用雷電模擬器以及Android studio自帶的模擬器來訪問本機搭建的Web服務器.

一、使用JSONObject解析數據

1.創建UI佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".Main2Activity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="點擊解析數據(JSONObject)"
        android:id="@+id/Send_request" />

</RelativeLayout>

2.在Activity裏編寫實現代碼

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import org.json.JSONArray;
import org.json.JSONObject;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main2Activity extends AppCompatActivity implements View.OnClickListener{

    private Button sendRequest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        sendRequest = findViewById(R.id.Send_request);
        sendRequest.setOnClickListener(this);
    }

    /**
     * 點擊按鈕調用下面的網絡請求方法
     * @param v
     */
    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.Send_request){
            sendRequestWithOkHttp();
        }
    }


    /**
     * 網絡請求方法
     */
    private void sendRequestWithOkHttp(){
        //Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    /**
                     * 1.創建一個OkHttpClient實例。
                     */
                    OkHttpClient client = new OkHttpClient();
                    /**
                     * 2.要發起HTTP請求,所以要創建一個Request對象,
                     * 通過url()方法設置目標網絡地址,
                     * 注意:使用Android studio自帶的模擬器訪問Web服務器時目標IP爲10.0.2.2:8080,
                     *但我這裏的測試環境用的是雷電模擬器,所以目標IP要換爲電腦IP地址(Web服務器在這個電腦上)
                     */
                    //Request request = new Request.Builder().url("http://10.0.2.2:8080/AndroidServer/testData.json").build();
                    Request request = new Request.Builder().url("http://電腦IP地址:8080/AndroidServer/testData.json").build();


                    /**
                     * 3.調用OkHttpClient的newCall()方法來創建一個Call對象,
                     * 並調用它的execute()方法來發送請求並獲取服務器返回的數據,
                     * 其中Response對象就是服務器返回的數據。
                     */
                    Response response = client.newCall(request).execute();
                    /**
                     *4.使用如下寫法來得到返回的具體內容。
                     */
                    String responseData = response.body().string();
                    parseJSONWithJSONObject(responseData);

                }catch (Exception e){
                    e.printStackTrace();
                }finally {

                }
            }
        }).start();
    }

    /**
     * JSONObject方式解析返回的JSON數據
     *
     * @param jsonData
     */
    private void parseJSONWithJSONObject(String jsonData){
        try{
            JSONArray jsonArray = new JSONArray(jsonData);
            for (int i = 0;i<jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.getString("name");
                String age = jsonObject.getString("age");
                String gender = jsonObject.getString("gender");
                //控制檯輸出
                Log.i("Main2Activity","======>>name:"+name);
                Log.i("Main2Activity","======>>age:"+age);
                Log.i("Main2Activity","======>>gender:"+gender);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

結果(點擊模擬器中的按鈕後Android studio控制檯打印輸出):
在這裏插入圖片描述

二、使用GSON解析數據

1.添加GSON庫的依賴

implementation 'com.google.code.gson:gson:2.8.5'

2.創建實體類App
GSON庫主要是將一段JSON格式的字符自動映射成一個對象,從而不需要我們再動手去編寫代碼進行解析了。因此我們還需要編寫對應的JSON對象實體類:

public class App {
    private String name;
    private String age;
    private  String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

3.創建UI佈局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".Main2Activity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="點擊解析數據(GSON)"
        android:id="@+id/Send_request" />

</RelativeLayout>

4.在Activity裏編寫實現代碼

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.List;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button sendRequest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendRequest = findViewById(R.id.Send_request);
        sendRequest.setOnClickListener(this);
    }

    /**
     * 點擊按鈕調用下面的網絡請求方法
     * @param v
     */
    @Override
    public void onClick(View v) {
        if (v.getId()==R.id.Send_request){
            sendRequestWithOkHttp();
        }
    }


    /**
     * 網絡請求方法
     */
    private void sendRequestWithOkHttp(){
        //Android不允許在主線程中進行網絡訪問,所以要另起線程來發起網絡請求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    /**
                     * 1.創建一個OkHttpClient實例。
                     */
                    OkHttpClient client = new OkHttpClient();
                    /**
                     * 2.要發起HTTP請求,所以要創建一個Request對象,
                     * 通過url()方法設置目標網絡地址,
                     * 注意:使用Android studio自帶的模擬器訪問Web服務器時目標IP爲10.0.2.2:8080,
                     *但我這裏的測試環境用的是雷電模擬器,所以目標IP要換爲電腦IP地址(Web服務器在這個電腦上)
                     */
                    //Request request = new Request.Builder().url("http://10.0.2.2:8080/AndroidServer/testData.json").build();
                    Request request = new Request.Builder().url("http://電腦IP地址:8080/AndroidServer/testData.json").build();


                    /**
                     * 3.調用OkHttpClient的newCall()方法來創建一個Call對象,
                     * 並調用它的execute()方法來發送請求並獲取服務器返回的數據,
                     * 其中Response對象就是服務器返回的數據。
                     */
                    Response response = client.newCall(request).execute();
                    /**
                     *4.使用如下寫法來得到返回的具體內容。
                     */
                    String responseData = response.body().string();
                    praseJSONWithGSON(responseData);

                }catch (Exception e){
                    e.printStackTrace();
                }finally {

                }
            }
        }).start();
    }


    /**
     * GSON方式解析返回的JSON數據
     *
     * @param jsonData
     */
    private void  praseJSONWithGSON(String jsonData){
        Gson gson = new Gson();
        /**
         * 如果只是簡單的JSON對象,那麼我們只需要簡單的調用如下代碼即可:
         * App app = gson.fromJson(jsonData,App.class);
         * 如果是一段JSON數組,我們需要藉助TypeToken將期望解析成的數據類型傳入到fromJson()方法中,
         * 這裏即採用的這種方式。
         */
        List<App> appList = gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getType());
        for (App app:appList){
            Log.i("Main2Activity","======>>name:"+app.getName());
            Log.i("Main2Activity","======>>age:"+app.getAge());
            Log.i("Main2Activity","======>>gender:"+app.getGender());
        }
    }
}

結果(點擊模擬器中的按鈕後Android studio控制檯打印輸出):
在這裏插入圖片描述
至此,以上JSONObject以及GSON兩個應用實例完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章