Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android:使用Gson解析復雜的JSON數據

Android:使用Gson解析復雜的JSON數據

編輯:關於Android編程

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,目前廣泛使用。本文主要講解android如何解析復雜格式的JSON數據,適合android初學者和初步接觸JSON的人。
1.JSON相關介紹:
首先了解一下JSON的相關內容,JSON中的數據是以鍵值對的形式出現的。例如”name”:”jack”;這就是一個鍵值對,可以理解為name=jack。JSON中很重要的兩個概念就是數組(array)和對象(object),初學者們很容易會把這兩個概念搞錯。區分是數組還是對象最簡單的辦法就是看是在{ ……}(大括號中),還是在 …… 。Object在大括號中,數組在http://blog.csdn.net/u012028501/article/details/中括號中。所有的JSON數據都是建立在數組和對象的基礎上經過不同的組合而生成的。因此,可以說理解了數組和對象,就可以解析出各種復雜的JSON數據。
2.Android中使用Gson進行JSON解析。
Android解析JSON數據的方法有很多,例如:原生android的解析方法就是JSONObject和JSONArray,這樣的解析有些繁瑣。還有就是利用第三方的包,本文主要是使用Gson對JSON數據進行解析,當然還有FastJson,這個也很不錯,大家可以試一試。
首先自然要下載GSON包了,這個網上有很多,我就不貼出連接了。下載完GSON包之後導入到項目中(project),就行了,如圖:
這裡寫圖片描述
這樣就可以使用Gson包了。
3.如何使用GSON解析
解析JSON數據最重要的一步就是根據JSON數據構建出bean文件,這裡一步一步教大家如何構建出bean文件。
JSON數據如下:

{
    "showapi_res_code":0,
    "showapi_res_error":"",
    "showapi_res_body":{
        "pagebean":{
            "allNum":577,
            "allPages":29,
            "contentlist":[
                {
                    "channelId":"5572a108b3cdc86cf39001cd",
                    "channelName":"國內焦點",
                    "desc":"   中國警察網北京4月22日電中國共產黨的優秀黨員,公安部原部長、黨委書記陶驷駒同志,因病醫治無效,於2016年4月18日0時36分在北京逝世, 享年81歲。22日上午,陶驷駒同志遺體送別儀式在北京舉行。  習近平、李克強、劉雲山、張高麗、劉延東、李源潮、孟建柱、趙樂際、胡錦....",
                    "imageurls":[
                        {
                            "height":480,
                            "url":"http://n.sinaimg.cn/news/transform/20160423/P7Jb-fxrqhar9853560.jpg",
                            "width":400
                        }
                    ],
                    "link":"http://news.sina.com.cn/c/nd/2016-04-23/doc-ifxrpvea1126476.shtml",
                    "pubDate":"2016-04-23 10:16:54",
                    "source":"新浪",
                    "title":"公安部原部長陶驷駒逝世 習近平胡錦濤等送花圈"
                },
                {
                    "channelId":"5572a108b3cdc86cf39001cd",
                    "channelName":"國內焦點",
                    "desc":"   原標題:山東3縣市購房補錢!繼鄒城、壽光後,即墨也加入資料圖  日前,即墨市制定《關於促進房地產市場持續健康平穩發展的實施意見》,即墨市財政 將對購房者予以補貼。從《意見》出台之日起到今年年底前,在即墨首次購新建商品房的市民,每平米可領取補貼50到200元。對購....",
                    "imageurls":[
                        {
                            "height":327,
                            "url":"http://ww4.sinaimg.cn/mw690/77de9208jw1f36aamk03mj20go093406.jpg",
                            "width":600
                        }
                    ],
                    "link":"http://news.sina.com.cn/c/nd/2016-04-23/doc-ifxrpvea1122744.shtml",
                    "pubDate":"2016-04-23 07:52:13",
                    "source":"新浪",
                    "title":"山東3縣市對購房者予以財政補貼"
                },
                {
                    "channelId":"5572a108b3cdc86cf39001cd",
                    "channelName":"國內焦點",
                    "desc":"   原標題:首家商業火箭公司成立  京華時報訊(記者潘珊菊)昨天下午,記者從航天科工集團獲悉,在成功發射首顆衛星“東方紅一號”46年後,中國航天 技術步入“商用時代”,我國首家商業模式開展研發和應用的專業化火箭公司已於今年2月16日在武漢注冊成立。  據介紹,該公....",
                    "imageurls":[

                    ],
                    "link":"http://news.sina.com.cn/o/2016-04-23/doc-ifxrpvqz6479220.shtml",
                    "pubDate":"2016-04-23 03:19:35",
                    "source":"新浪",
                    "title":"中國首家商業火箭公司成立 注冊時曾引官方爭議"
                }
            ],
            "currentPage":1,
            "maxResult":20
        },
        "ret_code":0
    }
}

一步一步來:
這裡寫圖片描述
這是把所有的括號都收起來的樣子
1展開大括號:
這是第一層,我們給一個標記為A。
這裡寫圖片描述
2展開showapi_res_body後面的大括號:
這是第二層,我們給一個標記為B。
這裡寫圖片描述
3展開pagebean後面的大括號:
這是第三層,我們給一個標記為C。
這裡寫圖片描述
4展開contentlist後面的中括號,這是一個數組
這是第四層,我們給一個標記為D。
這裡寫圖片描述
5展開contentlist裡面的object中的大括號
這是第五層,我們給一個標記為E。
這裡寫圖片描述
6展開imageurls的中括號
這是第六層,我們給一個標記為F
這裡寫圖片描述
7展開imageurls裡面object的大括號
這是第七層,我們給一個標記為G
這裡寫圖片描述
到此,所有的括號全部展開,所有的結構也非常清晰。contentlist和imageurls是兩個JSON數組而且數組的元素是JSON對象。
下面就開始構建bean文件了。
首先,建一個包 com.example.bean
包內放的就是bean文件。
如圖A所示,第一層構建一個類:
1.我們構建一個java類HomeNewsBean

package com.example.bean.homenews;

public class HomeNewsBean {
    private String showapi_res_code;
    private String showapi_res_error;
    private HomeNewsBeanBody showapi_res_body;
    public String getShowapi_res_code() {
        return showapi_res_code;
    }
    public void setShowapi_res_code(String showapi_res_code) {
        this.showapi_res_code = showapi_res_code;
    }
    public String getShowapi_res_error() {
        return showapi_res_error;
    }
    public void setShowapi_res_error(String showapi_res_error) {
        this.showapi_res_error = showapi_res_error;
    }
    public HomeNewsBeanBody getShowapi_res_body() {
        return showapi_res_body;
    }
    public void setShowapi_res_body(HomeNewsBeanBody showapi_res_body) {
        this.showapi_res_body = showapi_res_body;
    }
    @Override
    public String toString() {
        return "HomeNewsBean [showapi_res_code=" + showapi_res_code
                + ", showapi_res_error=" + showapi_res_error
                + ", showapi_res_body=" + showapi_res_body + "]";
    }
}

2.類中HomeNewsBeanBody是第二層B中的類。

package com.example.bean.homenews;

public class HomeNewsBeanBody {
    private HomeNewsPageBean pagebean;
    private String ret_code;
    public HomeNewsPageBean getPagebean() {
        return pagebean;
    }
    public void setPagebean(HomeNewsPageBean pagebean) {
        this.pagebean = pagebean;
    }
    public String getRet_code() {
        return ret_code;
    }
    public void setRet_code(String ret_code) {
        this.ret_code = ret_code;
    }
    @Override
    public String toString() {
        return "HomeNewsBeanBody [pagebean=" + pagebean + ", ret_code="
                + ret_code + "]";
    }
}

3.類中HomeNewsPageBean是第三層C中的類

package com.example.bean.homenews;

import java.util.List;

public class HomeNewsPageBean {
    private String allNum;
    private String allPages;
    private String currentPage;
    private String maxResult;
    private List contentlist;
    public String getAllNum() {
        return allNum;
    }
    public void setAllNum(String allNum) {
        this.allNum = allNum;
    }
    public String getAllPages() {
        return allPages;
    }
    public void setAllPages(String allPages) {
        this.allPages = allPages;
    }
    public String getCurrentPage() {
        return currentPage;
    }
    public void setCurrentPage(String currentPage) {
        this.currentPage = currentPage;
    }
    public String getMaxResult() {
        return maxResult;
    }
    public void setMaxResult(String maxResult) {
        this.maxResult = maxResult;
    }
    public List getContentlist() {
        return contentlist;
    }
    public void setContentlist(List contentlist) {
        this.contentlist = contentlist;
    }
    @Override
    public String toString() {
        return "HomeNewsPageBean [allNum=" + allNum + ", allPages=" + allPages
                + ", currentPage=" + currentPage + ", maxResult=" + maxResult
                + ", contentlist=" + contentlist + "]";
    }
}

4.類中HomeNewsContentList是第和第四層D和第五層E中的類,這裡注意:JSON數據中,這是數組,因此要使用List來存放。

package com.example.bean.homenews;

import java.util.List;

public class HomeNewsContentList {
    private String channelId;
    private String channelName;
    private String desc;
    private List imageurls; 
    private String link;
    private String pubDate;
    private String source;
    private String title;
    public String getChannelId() {
        return channelId;
    }
    public void setChannelId(String channelId) {
        this.channelId = channelId;
    }
    public String getChannelName() {
        return channelName;
    }
    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public List getImageurls() {
        return imageurls;
    }
    public void setImageurls(List imageurls) {
        this.imageurls = imageurls;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getPubDate() {
        return pubDate;
    }
    public void setPubDate(String pubDate) {
        this.pubDate = pubDate;
    }
    public String getSource() {
        return source;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    @Override
    public String toString() {
        return "HomeNewsContentList [channelId=" + channelId + ", channelName="
                + channelName + ", desc=" + desc + ", imageurls=" + imageurls
                + ", link=" + link + ", pubDate=" + pubDate + ", source="
                + source + ", title=" + title + "]";
    }
}

5.同理類中HomeNewsImages是第六層F和第七層G中的類,也是List存放。

package com.example.bean.homenews;

public class HomeNewsImages {
    private String height;
    private String url;
    private String width;
    public String getHeight() {
        return height;
    }
    public void setHeight(String height) {
        this.height = height;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getWidth() {
        return width;
    }
    public void setWidth(String width) {
        this.width = width;
    }
    @Override
    public String toString() {
        return "HomeNewsImages [height=" + height + ", url=" + url + ", width="
                + width + "]";
    }
}

到此為止,所有的bean文件全部構建完畢。
注意:所有的JSON數據的key:value鍵值對中的key要和bean文件中的對象一一對應,名字要完全一樣!不然無法解析!!!
例如 這裡面的
showapi_res_body要和JSON數據中的 一模一樣。
接下來就是解析的過程了,最難的地方已經過去,接下來就是幾行代碼的事情了。
首先:傳入URL,發送http請求,從服務器獲取JSON數據。

public static String netLink(String URL) {
        HttpClient httpClient = new DefaultHttpClient();
        //訪問指定的服務器
        HttpGet httpGet = new HttpGet(URL);
        HttpResponse httpResponse = null;
        String response = null;
        try {
            httpResponse = httpClient.execute(httpGet);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (httpResponse.getStatusLine().getStatusCode() == 200) {
            //200說明請求和響應都是成功的
            HttpEntity entity = httpResponse.getEntity();
            try {
                response = EntityUtils.toString(entity,"utf-8");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return response;
    }

返回的JSON數據在response中。然後,對返回的JSON進行解析。

Gson gson = new Gson();
        HomeNewsBean homeNewsBean = gson.fromJson(response, HomeNewsBean.class);

兩句話完成解析。
我把解析過程寫成了一個函數

public static List parseJsonWithGson2(List newsLists,String jsonData){
        Gson gson = new Gson();
        HomeNewsBean homeNewsBean = gson.fromJson(jsonData, HomeNewsBean.class);        for(int i = 0;i

這樣JSON數據就存在了List中。到此,解析結束。想要拿出數據只需調用newsLists.get()就可以了。
該文的JSON實例應該算比較復雜的JSON數據了,如果能掌握文中的復雜JSON解析,那麼其他的復雜JSON數據解析應該沒有問題。
最後,感謝閱讀,賣個萌o(∩_∩)o 哈哈!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved