天天看點

Android使用Gson解析JSON格式

1.json簡介與範例

JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,采用完全獨立于語言的文本格式,為Web應用開發提供了一種理想的資料交換格式。 類似于XML,都是通用資料交換格式,但是具有比XML更高的傳輸效率。

 

JSON的規則比較簡單:

1) 并列的資料之間用逗号(”,”)分隔。

2) 映射用冒号(”:”)表示。

3) 并列資料的集合(數組)用方括号(“[]”)表示。

4) 映射的集合(對象)用大括号(”{}”)表示。

Android使用Gson解析JSON格式

以下寫三個執行個體讓便于大家了解:

json對象:

// 簡單的JSON對象
        {
        "id":,
        "pageid":,
        "name":"Jason",
        "age":
     }
           

JsonArray:

["吃飯","睡覺","打豆豆"]
           

Json複合結構:

//使用對象和數組的組合構成複雜的資料結構。如下的代碼使用對象結構定義了一個“client”對象,在“client”對象中包含了一個客戶數組,而客戶數組中的值又是JSON對象
    {
         "client":
       [
         {"name":"jason","age":}, 
         {"name":"watson","age":}
       ]
    }
           

2.Gson的使用

Gson提供了兩個重要的方法:toJson()和fromJson()方法。

其中,toJson()方法用來實作将Java對象轉換為相應的JSON資料,fromJson()方法則用來實作将JSON資料轉換為相應的Java對象。

這兩個方法最重要的地方就是構造好實體類和json串呼應。

2.1 toJson()方法

toJson()方法用于将Java對象轉換為相應的JSON資料,主要有以下幾種形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

其中,方法(1)用于将JsonElement對象(可以是JsonObject、JsonArray等)轉換成JSON資料;

方法(2)用于将指定的Object對象序列化成相應的JSON資料;

方法(3)用于将指定的Object對象(可以包括泛型類型)序列化成相應的JSON資料。

2.2 fromJson()方法

fromJson()方法用于将JSON資料轉換為相應的Java對象,主要有以下幾種形式:

  (1) T fromJson(JsonElement json, Class classOfT);

  (2) T fromJson(JsonElement json, Type typeOfT);

  (3) T fromJson(JsonReader reader, Type typeOfT);

  (4) T fromJson(Reader reader, Class classOfT);

  (5) T fromJson(Reader reader, Type typeOfT);

  (6) T fromJson(String json, Class classOfT);

  (7) T fromJson(String json, Type typeOfT);

以上的方法用于将不同形式的JSON資料解析成Java對象。

2.3 實際測試代碼

接下來的代碼就是對Gson的這兩個方法的測試和應用:

老規矩,先上圖檔:

Android使用Gson解析JSON格式

兩個按鈕,作為兩個方法的轉換測試。

生成兩個bean對象,Person中嵌套有Address

Address.java

package com.usegson.Bean;

/**
 * 人詳細中的位址子產品獨立出來
 * 為觀察複合結構的json串格式
 * 主要是一些geter setter 方法
 * Created by Administrator on 2015/8/30.
 */
public class Address {

    private String street;
    private String city;
    private String country;

    public Address(String street, String city, String country) {
        super();
        this.street = street;
        this.city = city;
        this.country = country;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String toString() {
        return  "Address [street=" + street + ", city=" + city + ", country="+ country + "]";
    }
}
           

Person.java

package com.usegson.Bean;

/**
 * 人物資訊
 * 主要是一些geter setter 方法
 * 嵌套了位址Address
 * Created by Administrator on 2015/8/30.
 */
public class Person {
    private String name;
    private int age;
    private boolean male;
    private Address address;

    public Person(String name, int age, boolean male, Address address) {
        super();
        this.name = name;
        this.age = age;
        this.male = male;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public boolean isMale() {
        return male;
    }

    public void setMale(boolean male) {
        this.male = male;
    }

    public int getAge() {
        return age;
    }

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

    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", male=" + male
                + ", address=" + address + "]";
    }
}
           

MainActivity

package com.usegson;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.gson.Gson;
import com.usegson.Bean.Address;
import com.usegson.Bean.Person;

/**
 *  簡單地示範gson的fromJson和toJson的用法
 */
public class MainActivity extends AppCompatActivity {

    private Person person;   // 人物類
    private Button btntojson;  // tojson按鈕
    private Button btnfromjson;  // frojson按鈕
    private TextView tv; //文本

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化相關控件
        init();

        // 設定為final,好作為引用
        final Gson gson=new Gson();
        // 友善起見,将init中執行個體化的pesrson先轉化為json串格式存作字元串
        final String s1=gson.toJson(person);

        // tojson的監聽
        btntojson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 轉化已經在前面實作了,實際中應該是接收伺服器的字元串
                tv.setText(s1);
            }
        });


        // fromjson的監聽
        btnfromjson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // s1已經是JSON格式的了,模拟伺服器傳過來的json資料
                // 将json格式按昭Person中的定義形式輸出
                tv.setText(gson.fromJson(s1,Person.class).toString());
            }
        });

    }

    private void init() {
        btntojson= (Button) findViewById(R.id.button1);
        btnfromjson= (Button) findViewById(R.id.button2);
        tv= (TextView) findViewById(R.id.tv);
        // 直接傳入參數,構造person執行個體
        person=new Person("Jason",,true,new Address("CH","CD","CN"));
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
           

主界面就是兩個button,一個textview,設定監聽,點選兩個按鈕實作textview的顯示文本轉化。明天我會貼上圖。

這隻是最簡單的實作。後面我再對json數組進行解析一下,使程式更為豐滿。