Android學(xué)習(xí)之JSON解析(二)使用GSON技術(shù)解析JSON

前言

本人學(xué)生一枚,現(xiàn)階段也是進行Android學(xué)習(xí),若文章中有什么錯誤,請大l佬指出。

每篇格言:

我可以一落千丈,我偏要一鳴驚人。

用GSON框架技術(shù)解析JSON

GSON框架的官網(wǎng):https://mvnrepository.com/artifact/com.google.code.gson/gson

image
  • 如果使用Eclipse可發(fā)

      選擇相應(yīng)版本的jar包進行下載
    
  • 如果使用Android Studio開發(fā)

      通過Gradle,直接添加以來,不用下載jar包
    
image

Gson解析JSON對象(介紹都在代碼注釋中)

重要的事說一遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗

JSON數(shù)據(jù)

{
    "num": 1,
    "age": 20,
    "data": {
        "chinese": 100,
        "english": 90
    }
}

移動端

  • 結(jié)構(gòu):
image

重要的事說兩遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗

  • Data
public class Data {

    private int chinese;
    private int english;

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    @Override
    public String toString() {
        return "Data{" +
                "chinese=" + chinese +
                ", english=" + english +
                '}';
    }
}

重要的事說三遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗

  • Student
public class Student {

    private int num;
    private int age;
    private Data data;


    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

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

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", age=" + age +
                ", data=" + data +
                '}';
    }
}
  • NetWorkUtils
public class NetWorkUtils {

    private static HttpURLConnection sHttpURLConnection;
    private static BufferedReader sBufferedReader;
    private static InputStream sInputStream;

    /**
     * 通過URL獲取String
     *
     * @param urlStr     需要傳入的URL
     * @param requestWay 需要傳入的請求方式(GET/POST)
     * @return 返貨獲取的json字符串
     */
    public static String sendUrlGetString(String urlStr, String requestWay) {

        String jsonStr = null;

        try {
            // 創(chuàng)建URL對象
            URL url = new URL(urlStr);
            // 創(chuàng)建HttpURLConnection對象
            sHttpURLConnection = (HttpURLConnection) url.openConnection();
            // 設(shè)置網(wǎng)絡(luò)的請求方式
            sHttpURLConnection.setRequestMethod(requestWay);
            // 設(shè)置鏈接主機超時
            sHttpURLConnection.setConnectTimeout(8000);
            // 設(shè)置從主機讀取數(shù)據(jù)超時
            sHttpURLConnection.setReadTimeout(8000);
            // 獲取輸入流
            sInputStream = sHttpURLConnection.getInputStream();
            // 對獲取到的輸入流進行讀取
            sBufferedReader = new BufferedReader(new InputStreamReader(sInputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";
            while ((line = sBufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }
            jsonStr = stringBuffer.toString();
            return jsonStr;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (sBufferedReader != null) {
                try {
                    sBufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if (sHttpURLConnection != null) {
                sHttpURLConnection.disconnect();

            }
        }
        return jsonStr;
    }

}
  • MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mJsonTxt;

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


        initViews();

    }

    private void initViews() {

        Button gsonBtn = findViewById(R.id.gson_btn);
        gsonBtn.setOnClickListener(this);

        mJsonTxt = findViewById(R.id.json_txt);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.gson_btn:

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        paraseJSONWithGSON(NetWorkUtils.sendUrlGetString("http://xxx:8080/JsonThree", "GET"));
                    }
                }).start();


                break;
        }
    }

    private void paraseJSONWithGSON(final String str) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                // 創(chuàng)建一個Gson對象
                Gson gson = new Gson();
                // 調(diào)用Gson對象的fromJson(String str,Class<T> class)
                // 第一個參數(shù) : 通過網(wǎng)絡(luò)請求獲取的JSON字符串
                // 第二個參數(shù) : 傳入一個JavaBean對象
                Student student = gson.fromJson(str, Student.class);

                mJsonTxt.setText(student.toString());

            }
        });

    }

}


Gson解析JSON數(shù)組(介紹都在代碼注釋中)

JSON數(shù)據(jù)

[
    {
        "id": 1,
        "name": "Amy",
        "age": 20
    },
    {
        "id": 2,
        "name": "Tom",
        "age": 10
    }
]

移動端

  • People
public class People {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mJsonTxt;

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


        initViews();

    }

    private void initViews() {
        Button gsonArrayBtn = findViewById(R.id.gsonArray_btn);
        gsonArrayBtn.setOnClickListener(this);

        mJsonTxt = findViewById(R.id.json_txt);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.gsonArray_btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        paraseJSONWithGSONArray(NetWorkUtils.sendUrlGetString("http://XXX:8080/JsonTwo", "GET"));
                    }
                }).start();

                break;
        }
    }

    private void paraseJSONWithGSONArray(final String s) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                // 創(chuàng)建Gson對象
                Gson gson = new Gson();
                // 如果解析一段JSON數(shù)組會稍微麻煩點。我們需要借助TypeToken將期望解析成的數(shù)據(jù)類型傳入到fromJson方法中。
                List<People> peopleList = gson.fromJson(s, new TypeToken<List<People>>() {
                }.getType());
                for (People people : peopleList) {
                    mJsonTxt.setText("id = " + people.getId() + "\n" + "name = " + people.getName() + "\n" + "age = " + people.getAge());
                }

            }
        });
    }
}


總結(jié)

當(dāng)然本篇文章中都是一些簡單的JSON數(shù)據(jù)格式,適合入門學(xué)習(xí),當(dāng)然在實際開發(fā)中會很復(fù)雜的JSON數(shù)據(jù)格式,到時候大家見招拆招,不要死記解析步驟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容