1. 程式人生 > >GSON解析複雜的JSON陣列

GSON解析複雜的JSON陣列

1.GSON的兩個重要方法

  在GSON的API中,提供了兩個重要的方法:toJson()和fromJson()方法。其中,toJson()方法用來實現將Java物件轉換為相應的JSON資料,fromJson()方法則用來實現將JSON資料轉換為相應的Java物件。

1.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資料。

1.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物件。
  
下面我將以一個具體的列子來說明通過Gson方式解析複雜的json資料
1.將要解析的資料如下面的格式

服務的端返回的JSON資料

{
    "song_list": [
        {
            "artist_id": "88",
            "language": "國語",
            "pic_big": "http://musicdata.baidu.com/data2/pic/76dc8dc35a361ef018c2c52befabfb03/267709259/267709259.jpg",
            "pic_small": "http://musicdata.baidu.com/data2/pic/eede55e93e4f0353b1eea0a7627e7be1/267709262/267709262.jpg",
            "country": "內地",
            "area": "0",
            "publishtime": "2015-05-20",
            "album_no": "4",
            "lrclink": "http://musicdata.baidu.com/data2/lrc/ac66a881bd5cb97ad351936606c37495/266097259/266097259.lrc",
            "copy_type": "1",
            "hot": "1314161",
            "all_artist_ting_uid": "2517",
            "resource_type": "0",
            "is_new": "0",
            "rank_change": "0",
            "rank": "1",
            "all_artist_id": "88",
            "style": "流行",
            "del_status": "0",
            "relate_status": "0",
            "toneid": "0",
            "all_rate": "64,128,192,256,320,flac",
            "sound_effect": "0",
            "file_duration": 0,
            "has_mv_mobile": 0,
            "versions": "",
            "bitrate_fee": "{\"0\":\"0|0\",\"1\":\"0|0\"}",
            "song_id": "242078437",
            "title": "演員",
            "ting_uid": "2517",
            "author": "薛之謙",
            "album_id": "241838068",
            "album_title": "初學者",
            "is_first_publish": 0,
            "havehigh": 2,
            "charge": 0,
            "has_mv": 0,
            "learn": 1,
            "song_source": "web",
            "piao_id": "0",
            "korean_bb_song": "0",
            "resource_type_ext": "0",
            "mv_provider": "0000000000",
            "artist_name": "薛之謙"
        }
    ],
    "billboard": {
        "billboard_type": "2",
        "billboard_no": "1906",
        "update_date": "2016-07-24",
        "billboard_songnum": "587",
        "havemore": 1,
        "name": "熱歌榜",
        "comment": "該榜單是根據百度音樂平臺歌曲每週播放量自動生成的資料榜單,統計範圍為百度音樂平臺上的全部歌曲,每日更新一次",
        "pic_s640": "http://b.hiphotos.baidu.com/ting/pic/item/5d6034a85edf8db1194683910b23dd54574e74df.jpg",
        "pic_s444": "http://d.hiphotos.baidu.com/ting/pic/item/c83d70cf3bc79f3d98ca8e36b8a1cd11728b2988.jpg",
        "pic_s260": "http://a.hiphotos.baidu.com/ting/pic/item/838ba61ea8d3fd1f1326c83c324e251f95ca5f8c.jpg",
        "pic_s210": "http://business.cdn.qianqian.com/qianqian/pic/bos_client_58c1700bf56062108d8d622a95708032.jpg",
        "web_url": "http://music.baidu.com/top/dayhot"
    },
    "error_code": 22000
}

2.必須定義如下一些的實體類資料
注意:在定義實體類是要與伺服器返回的json欄位要完全一致。
MusicListResponse.java
裡邊定義的是服務端返回的json資料,遇到[……]我用了list集合定義它的型別

public class MusicListResponse {
    private List<Music> song_list;
    private BillBoard billboard;
    private int error_code;

    public MusicListResponse() {
    }

    public MusicListResponse(List<Music> song_list, BillBoard billboard,
            int error_code) {
        super();
        this.song_list = song_list;
        this.billboard = billboard;
        this.error_code = error_code;
    }
    public List<Music> getSong_list() {
        return song_list;
    }
    public void setSong_list(List<Music> song_list) {
        this.song_list = song_list;
    }
    public BillBoard getBillboard() {
        return billboard;
    }
    public void setBillboard(BillBoard billboard) {
        this.billboard = billboard;
    }
    public int getError_code() {
        return error_code;
    }
    public void setError_code(int error_code) {
        this.error_code = error_code;
    }
}

BillBoard.java
這是BillBoard的實體類,裡面定義的是 “billboard”: {……}內的json欄位
宣告它們的無參和有參的構造方法,還有它們的get和set方法

public class BillBoard {
    private int havemore;
    private String billboard_type;
    private String billboard_no;
    private String update_date;
    private String billboard_songnum;
    private String name;
    private String comment;
    private String pic_s640;
    private String pic_s444;
    private String pic_s260;
    private String pic_s210;
    private String web_url;

    public BillBoard() {
    }

    public BillBoard(int havemore, String billboard_type, String billboard_no,
            String update_date, String billboard_songnum, String name,
            String comment, String pic_s640, String pic_s444, String pic_s260,
            String pic_s210, String web_url) {
        super();
        this.havemore = havemore;
        this.billboard_type = billboard_type;
        this.billboard_no = billboard_no;
        this.update_date = update_date;
        this.billboard_songnum = billboard_songnum;
        this.name = name;
        this.comment = comment;
        this.pic_s640 = pic_s640;
        this.pic_s444 = pic_s444;
        this.pic_s260 = pic_s260;
        this.pic_s210 = pic_s210;
        this.web_url = web_url;
    }

    public int getHavemore() {
        return havemore;
    }
    public void setHavemore(int havemore) {
        this.havemore = havemore;
    }
    public String getBillboard_type() {
        return billboard_type;
    }
    public void setBillboard_type(String billboard_type) {
        this.billboard_type = billboard_type;
    }
    public String getBillboard_no() {
        return billboard_no;
    }
    public void setBillboard_no(String billboard_no) {
        this.billboard_no = billboard_no;
    }
    public String getUpdate_date() {
        return update_date;
    }
    public void setUpdate_date(String update_date) {
        this.update_date = update_date;
    }
    public String getBillboard_songnum() {
        return billboard_songnum;
    }
    public void setBillboard_songnum(String billboard_songnum) {
        this.billboard_songnum = billboard_songnum;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getComment() {
        return comment;
    }
    public void setComment(String comment) {
        this.comment = comment;
    }
    public String getPic_s640() {
        return pic_s640;
    }
    public void setPic_s640(String pic_s640) {
        this.pic_s640 = pic_s640;
    }
    public String getPic_s444() {
        return pic_s444;
    }
    public void setPic_s444(String pic_s444) {
        this.pic_s444 = pic_s444;
    }
    public String getPic_s260() {
        return pic_s260;
    }
    public void setPic_s260(String pic_s260) {
        this.pic_s260 = pic_s260;
    }
    public String getPic_s210() {
        return pic_s210;
    }
    public void setPic_s210(String pic_s210) {
        this.pic_s210 = pic_s210;
    }
    public String getWeb_url() {
        return web_url;
    }
    public void setWeb_url(String web_url) {
        this.web_url = web_url;
    }
}

Music.java
這是Music的實體類,裡面定義的是 “song_list”: [{……},{……}……]內的json欄位,宣告它們的無參和有參的構造方法,還有它們的get和set方法。(要以服務端返回的資料,完全一致)

public class Music {
    private int file_duration;
    private int has_mv_mobile;
    private int is_first_publish;
    private int havehigh;
    private int charge;
    private int has_mv;
    private int learn;

    private String artist_id;
    private String language;
    private String pic_big;
    private String pic_small;
    private String country;
    private String area;
    private String publishtime;
    private String album_no;
    private String lrclink;
    private String copy_type;
    private String hot;
    private String all_artist_ting_uid;
    private String resource_type;
    private String is_new;
    private String rank_change;
    private String rank;
    private String all_artist_id;
    private String style;
    private String del_status;
    private String relate_status;
    private String toneid;
    private String all_rate;
    private String sound_effect;
    private String versions;
    private String bitrate_fee;
    private String song_id;
    private String title;
    private String ting_uid;
    private String author;
    private String album_id;
    private String album_title;
    private String song_source;
    private String piao_id;
    private String korean_bb_song;
    private String resource_type_ext;
    private String mv_provider;
    private String artist_name;

    public Music() {
    }

    public Music(int file_duration, int has_mv_mobile, int is_first_publish,
            int havehigh, int charge, int has_mv, int learn, String artist_id,
            String language, String pic_big, String pic_small, String country,
            String area, String publishtime, String album_no, String lrclink,
            String copy_type, String hot, String all_artist_ting_uid,
            String resource_type, String is_new, String rank_change,
            String rank, String all_artist_id, String style, String del_status,
            String relate_status, String toneid, String all_rate,
            String sound_effect, String versions, String bitrate_fee,
            String song_id, String title, String ting_uid, String author,
            String album_id, String album_title, String song_source,
            String piao_id, String korean_bb_song, String resource_type_ext,
            String mv_provider, String artist_name) {
        super();
        this.file_duration = file_duration;
        this.has_mv_mobile = has_mv_mobile;
        this.is_first_publish = is_first_publish;
        this.havehigh = havehigh;
        this.charge = charge;
        this.has_mv = has_mv;
        this.learn = learn;
        this.artist_id = artist_id;
        this.language = language;
        this.pic_big = pic_big;
        this.pic_small = pic_small;
        this.country = country;
        this.area = area;
        this.publishtime = publishtime;
        this.album_no = album_no;
        this.lrclink = lrclink;
        this.copy_type = copy_type;
        this.hot = hot;
        this.all_artist_ting_uid = all_artist_ting_uid;
        this.resource_type = resource_type;
        this.is_new = is_new;
        this.rank_change = rank_change;
        this.rank = rank;
        this.all_artist_id = all_artist_id;
        this.style = style;
        this.del_status = del_status;
        this.relate_status = relate_status;
        this.toneid = toneid;
        this.all_rate = all_rate;
        this.sound_effect = sound_effect;
        this.versions = versions;
        this.bitrate_fee = bitrate_fee;
        this.song_id = song_id;
        this.title = title;
        this.ting_uid = ting_uid;
        this.author = author;
        this.album_id = album_id;
        this.album_title = album_title;
        this.song_source = song_source;
        this.piao_id = piao_id;
        this.korean_bb_song = korean_bb_song;
        this.resource_type_ext = resource_type_ext;
        this.mv_provider = mv_provider;
        this.artist_name = artist_name;
    }
    public int getFile_duration() {
        return file_duration;
    }
    public void setFile_duration(int file_duration) {
        this.file_duration = file_duration;
    }
    public int getHas_mv_mobile() {
        return has_mv_mobile;
    }
    public void setHas_mv_mobile(int has_mv_mobile) {
        this.has_mv_mobile = has_mv_mobile;
    }
    public int getIs_first_publish() {
        return is_first_publish;
    }
    public void setIs_first_publish(int is_first_publish) {
        this.is_first_publish = is_first_publish;
    }
    public int getHavehigh() {
        return havehigh;
    }
    public void setHavehigh(int havehigh) {
        this.havehigh = havehigh;
    }
    public int getCharge() {
        return charge;
    }
    public void setCharge(int charge) {
        this.charge = charge;
    }
    public int getHas_mv() {
        return has_mv;
    }
    public void setHas_mv(int has_mv) {
        this.has_mv = has_mv;
    }
    public int getLearn() {
        return learn;
    }
    public void setLearn(int learn) {
        this.learn = learn;
    }
    public String getArtist_id() {
        return artist_id;
    }
    public void setArtist_id(String artist_id) {
        this.artist_id = artist_id;
    }
    public String getLanguage() {
        return language;
    }
    public void setLanguage(String language) {
        this.language = language;
    }
    public String getPic_big() {
        return pic_big;
    }
    public void setPic_big(String pic_big) {
        this.pic_big = pic_big;
    }
    public String getPic_small() {
        return pic_small;
    }
    public void setPic_small(String pic_small) {
        this.pic_small = pic_small;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getArea() {
        return area;
    }
    public void setArea(String area) {
        this.area = area;
    }
    public String getPublishtime() {
        return publishtime;
    }
    public void setPublishtime(String publishtime) {
        this.publishtime = publishtime;
    }
    public String getAlbum_no() {
        return album_no;
    }
    public void setAlbum_no(String album_no) {
        this.album_no = album_no;
    }
    public String getLrclink() {
        return lrclink;
    }
    public void setLrclink(String lrclink) {
        this.lrclink = lrclink;
    }
    public String getCopy_type() {
        return copy_type;
    }
    public void setCopy_type(String copy_type) {
        this.copy_type = copy_type;
    }
    public String getHot() {
        return hot;
    }
    public void setHot(String hot) {
        this.hot = hot;
    }
    public String getAll_artist_ting_uid() {
        return all_artist_ting_uid;
    }
    public void setAll_artist_ting_uid(String all_artist_ting_uid) {
        this.all_artist_ting_uid = all_artist_ting_uid;
    }
    public String getResource_type() {
        return resource_type;
    }
    public void setResource_type(String resource_type) {
        this.resource_type = resource_type;
    }
    public String getIs_new() {
        return is_new;
    }
    public void setIs_new(String is_new) {
        this.is_new = is_new;
    }
    public String getRank_change() {
        return rank_change;
    }
    public void setRank_change(String rank_change) {
        this.rank_change = rank_change;
    }
    public String getRank() {
        return rank;
    }
    public void setRank(String rank) {
        this.rank = rank;
    }
    public String getAll_artist_id() {
        return all_artist_id;
    }
    public void setAll_artist_id(String all_artist_id) {
        this.all_artist_id = all_artist_id;
    }
    public String getStyle() {
        return style;
    }
    public void setStyle(String style) {
        this.style = style;
    }
    public String getDel_status() {
        return del_status;
    }
    public void setDel_status(String del_status) {
        this.del_status = del_status;
    }
    public String getRelate_status() {
        return relate_status;
    }
    public void setRelate_status(String relate_status) {
        this.relate_status = relate_status;
    }
    public String getToneid() {
        return toneid;
    }
    public void setToneid(String toneid) {
        this.toneid = toneid;
    }
    public String getAll_rate() {
        return all_rate;
    }
    public void setAll_rate(String all_rate) {
        this.all_rate = all_rate;
    }
    public String getSound_effect() {
        return sound_effect;
    }
    public void setSound_effect(String sound_effect) {
        this.sound_effect = sound_effect;
    }
    public String getVersions() {
        return versions;
    }
    public void setVersions(String versions) {
        this.versions = versions;
    }
    public String getBitrate_fee() {
        return bitrate_fee;
    }
    public void setBitrate_fee(String bitrate_fee) {
        this.bitrate_fee = bitrate_fee;
    }
    public String getSong_id() {
        return song_id;
    }
    public void setSong_id(String song_id) {
        this.song_id = song_id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getTing_uid() {
        return ting_uid;
    }
    public void setTing_uid(String ting_uid) {
        this.ting_uid = ting_uid;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public String getAlbum_id() {
        return album_id;
    }
    public void setAlbum_id(String album_id) {
        this.album_id = album_id;
    }
    public String getAlbum_title() {
        return album_title;
    }
    public void setAlbum_title(String album_title) {
        this.album_title = album_title;
    }
    public String getSong_source() {
        return song_source;
    }
    public void setSong_source(String song_source) {
        this.song_source = song_source;
    }
    public String getPiao_id() {
        return piao_id;
    }
    public void setPiao_id(String piao_id) {
        this.piao_id = piao_id;
    }
    public String getKorean_bb_song() {
        return korean_bb_song;
    }
    public void setKorean_bb_song(String korean_bb_song) {
        this.korean_bb_song = korean_bb_song;
    }
    public String getResource_type_ext() {
        return resource_type_ext;
    }
    public void setResource_type_ext(String resource_type_ext) {
        this.resource_type_ext = resource_type_ext;
    }
    public String getMv_provider() {
        return mv_provider;
    }
    public void setMv_provider(String mv_provider) {
        this.mv_provider = mv_provider;
    }
    public String getArtist_name() {
        return artist_name;
    }
    public void setArtist_name(String artist_name) {
        this.artist_name = artist_name;
    }
}

然後具體的實體類定義好了就將解析資料了,下面就是我的解析資料類

public class MainActivity extends Activity {
    private RequestQueue queue;
    protected MusicListResponse resp;
    private private List<Music> musics;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //傳送http請求載入音樂列表資料
        loadMusics();
    }
    /**
     * 載入所有音樂資料
     */
    private void loadMusics() {
        //1.建立volley的  RequestQueue 
        queue = Volley.newRequestQueue(this);
        //2. StringRequest
        String url = "http://tingapi.tiantian.com/v1/restserver/ting?from=qianqian&version=2.1.0&method=tiantian.ting.billboard.billList&format=json&type=2&offset=0&size=50";
        StringRequest req = new StringRequest(url, new Listener<String>() {
            public void onResponse(String response) {
                //使用gson解析json字串
                Gson gson = new Gson();
                resp = gson.fromJson(response, MusicListResponse.class);
                musics = resp.getSong_list();
            }
        }, new ErrorListener() {
            public void onErrorResponse(VolleyError error) {
                Log.e("error", error.getMessage());
            }
        });
        //3. add()
        queue.add(req);
    }
}   

其中上面的RequestQueue是開源網路庫Volley的使用,如果你對該庫的使用還不熟悉的話可以參考http://blog.csdn.net/guolin_blog/article/details/17482095,該作者對Volley庫的使用講解得非常的細緻和深入
大家可以仔細的去拜讀。