2015年2月28日

【Android】運用Gson解析讀取JSON格式資料

各位Android安卓開發者大家好 ^^

今天小黑人要與大家分享的文章主題是"Gson",大家可能會有一個疑問就是Gson是什麼東西,簡單來說Gson就是Google開發用來解析JSON格式資料的應用工具主要負責將JSON字串與JAVA物件做兩者之間的轉換,那名稱為什麼會叫做Gson呢,其實是當初Google因公司內部需求而自行研發出的解析工具,在20085月公開發佈第一版提供給大家做使用,直到至今Gson這套工具還是擁有許多開發者在使用,那我們要怎麼運用Gson來解析JSON格式資料呢?如果藉由Gson來解析是非常方便快速的,就讓我們繼續看下去吧~


1. 首先,我們要先下載Gson解析應用的Library,這是Google所提供的開放程式庫,下載網址為 : https://code.google.com/p/google-gson/,大家可以先Gsonjar檔下載並放置專案Libs資料夾內GsonLibrary放入專案內後就可以開始使用Gson類別來進行解析囉。

2.
運用Gson類別不需要變更到AndroidManifest.xmlLayout(.xml),所以我們直接在Activity(.java)上運用Gson類別的解析功能,接下來就是JSON的文字內容,要取得JSON訊息正常的步驟是串接API後所回傳的文字內容,但小黑人這次範例就先省略API串接這一部分暫時用假資料來取代,如果大家有想知道如何串接API訊息的話,可以參考小黑人相關文章(API網路串接傳輸: http://dean-android.blogspot.tw/2014/03/androidserver-apihttpgethttppost.html)。好,小黑人這次假設用個簡單的會員資料的型態格式來做範例,會員資料的格式其實就是人的資訊意思,所以小黑人範例假設的JSON格式內容就包含id、姓名、手機、地址、身高、體重、興趣,然後興趣欄位是個陣列型態,代表著可以擁有多種興趣的意思,這些資料型態只是小黑人簡單舉例的欄位,實際上大家要依專案需求制訂欄位喔,預設的JSON文字格式如下 :

/**
*
{"id":17,
"name":"
小黑人",
"phone":"09xx-xxx-xxx",
"address":"
小黑人的Android教室",
"height":178.6,
"weight":60.3,
"interests":[{"type":"
室內活動","item":"看電影"},{"type":"戶外活動","item":"打籃球"},{"type":"戶外活動","item":"登山
"}]}
*
*/


3.
知道API回傳的JSON格式內容後,我們就可以針對JSON的架構建立JAVA物件,如上方的JSON結構可以用一個JAVA物件類別(姓名、電話...)完成,但是比較特別的地方是興趣這裡是屬於陣列型態,裡面又包含類型和內容,所以興趣這部分我們再建立一個屬於興趣的類別帶入,小黑人針對這兩個物件類別建立的程式碼如下 :
a. People人員資訊類別 :
public class People
{
        //ID
        private int id;
        //
姓名
        private String name;
        //
電話
        private String phone;
        //
地址
        private String address;
        //
身高
        private double height;
        //
體重
        private double weight;
        //
興趣
        private Interest[] interests;
       
        //P.S.
以上變數名稱與串接欄位必需相符
       
        public People()
        {
               
        }
       
        public void setID(int id)
        {
                this.id = id;
        }
       
        public int getID()
        {
                return id;
        }
       
        public void setName(String name)
        {
                this.name = name;
        }
       
        public String getName()
        {
                return name;
        }
       
        public void setPhone(String phone)
        {
                this.phone = phone;
        }
       
        public String getPhone()
        {
                return phone;
        }
       
        public void setAddress(String address)
        {
                this.address = address;
        }
       
        public String getAddress()
        {
                return address;
        }
       
        public void setHeight(double height)
        {
                this.height = height;
        }
       
        public double getHeight()
        {
                return height;
        }
       
        public void setWeight(double weight)
        {
                this.weight = weight;
        }
       
        public double getWeight()
        {
                return weight;
        }
       
        public void setInterests(Interest[] interests)
        {
                this.interests = interests;
        }
       
        public Interest[] getInterests()
        {
                return interests;
        }
}

b. Interest
興趣類別 :
public class Interest
{
        //
類型
        private String type;
        //
項目
        private String item;
       
        //P.S.
以上變數名稱與串接欄位必需相符
       
        public Interest()
        {
               
        }
       
        public void setType(String type)
        {
                this.type = type;
        }
       
        public String getType()
        {
                return type;
        }
       
        public void setItem(String item)
        {
                this.item = item;
        }
       
        public String getItem()
        {
                return item;
        }
}

4.
最後的步驟就是運用Gson類別把JSON內容裝入到我們建立好的物件裡,只要簡短的幾行程式碼就可以完成囉,程式碼如下:

public class MainActivity extends Activity
{
        private final String TAG = "
小黑人的Android教室";
       
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                //
假設API回傳的JSON資料
                String JsonString = "{\"id\":17,\"name\":\"
小黑人\",\"phone\":\"09xx-xxx-xxx\",\"address\":\"小黑人的Android教室\",\"height\":178.6,\"weight\":60.3,\"interests\":[{\"type\":\"室內活動\",\"item\":\"看電影\"},{\"type\":\"戶外活動\",\"item\":\"打籃球\"},{\"type\":\"戶外活動\",\"item\":\"登山\"}]}";
               
                //
建立Gson類別並將JSON資訊裝入People物件裡
                Gson gson = new Gson();
                People mPeople = gson.fromJson(JsonString, People.class);

               
                //P.S.
以上兩行就已經將資訊裝入People物件裡了,完成。

                //
如果想要查看People物件內容,下方用Log印出資訊。
                Log.d(TAG, "id : " + mPeople.getID());
                Log.d(TAG, "name : " + mPeople.getName());
                Log.d(TAG, "phone : " + mPeople.getPhone());
                Log.d(TAG, "address : " + mPeople.getAddress());
                Log.d(TAG, "height : " + mPeople.getHeight());
                Log.d(TAG, "weight : " + mPeople.getWeight());
               
                for(int i = 0 ; i < mPeople.getInterests().length ; i++)
                {
                        Log.d(TAG, "Type : " + mPeople.getInterests()[i].getType());
                        Log.d(TAG, "Item : " + mPeople.getInterests()[i].getItem());
                }
        }
}

以上就是運用Gson類別將JSON格式文字裝入JAVA物件裡,非常的方便好用,簡短的程式碼就可以完成許多步驟,大家可以試試看運用Gson來解析JSON格式文字喔!

謝謝大家,如有任何問題都可以和小黑人一起交流討論!

☆小黑人☆

10 則留言:

  1. 我有寄信給您喔!
    希望可以一同討論相關問題

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您,
      根據您的問題小黑人與您解釋,
      可以請問發生錯誤的動作是在擷取的部分還是儲存的部分呢?
      如果要做儲存的動作需要在AndroidManifest.xml加入權限,

      您可以再試試看,如果還是發生錯誤的話,可以查看LogCat的錯誤原因。

      感謝您的留言!

      刪除
    2. 您好,很抱歉這麼久才回覆您,
      根據您的問題小黑人與您解釋,
      可以請問發生錯誤的動作是在擷取的部分還是儲存的部分呢?
      如果要做儲存的動作需要在AndroidManifest.xml加入權限,
      < uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" / >
      您可以再試試看,如果還是發生錯誤的話,可以查看LogCat的錯誤原因。

      感謝您的留言!

      刪除
  2. 您好,謝謝您的肯定。
    感謝您的留言與支持!

    回覆刪除
  3. 老師...我天天用Gmail,但是沒有天天看您的網站啊= =
    上面那個權限我有加入喔,我覺得問題出在我的繪圖程式,我將螢幕變為畫布,但是那個畫布上卻無法使用任何元件,所以當我將imageview放在畫布上,然後想要使用imageview時就會出錯。
    至於log cat ...我還不會看= =,我研究一下

    回覆刪除
    回覆
    1. 無法使用imageview的我,無法將螢幕截圖到imageview,然後儲存,所以問題出在擷取

      刪除
  4. 請問若是JSON解出來有http圖的網址,該如何使用 imageview 讀出圖,謝謝。

    回覆刪除
  5. 難得一見的 Android 教學網站,版主不更新了嗎...

    回覆刪除
  6. Amazing post I Read your blog, it`s so informative great work thanks for sharing
    any one can explore INDIA visit us we are PACIFIC TOUR INDIA join us
    Some Packages:-
    Golden Triangle Tour 5 Days

    Golden Triangle Tour 6 Days

    Golden Triangle Tour 4 Days

    Golden Triangle & Varanasi

    Golden Triangle & Ranthambore

    for more information contact us
    CONTACT INFO
    Shop No.16, First Floor, Prerna Plaza, Fatehabad Road, Agra- 282001
    Mob : +91 - 9759747417, 9568617417
    Email: info@pacifictourindia.com,
    Web-side: www.pacifictourindia.com

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!