Json数据的解析

最新在写基于安卓的网络音乐播放器,搜索网络音乐时服务器端返回json数据响应,为了从中取出我们需要的音乐信息,需要对json数据进行分析,通过在网络搜索结合自己的了解后发现其实这种数据结构还是比较简单了。

在包org.json下有如下几个类

  1. JSONObject
    JSONObject有一个String参数的构造函数,用法为
JSONObject jo = new JSONObject(string);

其中string参数的内容必须是如下格式(JSONObject格式)的键值对:

String str = "{"key1":value1,"key2":value2,...}";

而str中的value可以是string类型,也可以是JSONObject格式的内容,或者是JSONArray格式;因为JSONObject可以有多个键值对,并且每个键值对的value可以是不同类型,因此,其多个value可以同时包含string,JSONObject和JSONArray格式(下面将介绍该类)。

2.JSONArray
JSONArray从字面上来理解是JSONObject的数组这种数据结构,其实也是如此,JSONArray也有如下构造函数:

JSONArray ja = new JSONArray(string);

其中string必须是如下格式(JSONArray格式)的内容:

string str = "[{"key1":value1,"key2":value2},{},...]";

可以看出来JSONArray格式的内容最外围是一个中括号[],而中括号中是多个以逗号为间隔的大括号,而大括号正是JSONObject格式的内容,因此说JSONArray是JSONObject数组。

3.JSONObject和JSONArray
前面介绍JSONArray并未介绍怎么获取其中的value,这里我们补充下。
假设有如下的JSONObject格式

{"key1":str1,"key2":{"key2-1":str2,...},"key3":[{"key3-1":str3},{},...]}

我们如何取出其中的string类型的值tsr1,str2和str3呢?

取出str1:

String str = jo.getString("key1");

取出str2:

JSONObject jo1 = jo.getJSONObject("key2");
String str = jo1.getString(key2-1);

取出str3:

JSONArray ja = jo.getJSONArray(key3);
JSONObject jo1 = ja.getJSONObject(0);
String str = jo1.getString(key3-1);

可以看出来,当JSONObject中的value是String类型时,直接调用getString(key),当value是JSONObject格式时,调用getJSONObject(key),当value是JSONArray格式时,调用getJSONArray(key); 而JSONArray获取JSONObject时调用getJSONObject(index)。
总的来说,json数据的格式还是很简单的,都是一些键值对,跟map结构非常相似,稍微复杂点的无非就是加了几层嵌套。

最后附上我们的实战-解析网络音乐的json数据:
搜索关键字为:paomo
返回json格式数据如下:

{"result":{"songCount":1257,"songs":[{"id":32957729,"name":"泡沫","artists":[{"id":1032426,"name":"打扰一下乐团","picUrl":null}],"album":{"id":3175244,"name":"泡沫","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/zDrcg0sB_KSB5ayombqLVw==/7970359790729852.jpg"},"audio":"http://m2.music.126.net/m8RG4MGY3MujFSn976ibsA==/7963762720986216.mp3","djProgramId":0,"page":"http://music.163.com/m/song/32957729"},{"id":433107116,"name":"泡沫","artists":[{"id":12119288,"name":"T-Tone_小T","picUrl":null}],"album":{"id":34894927,"name":"泡沫","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/_VXvibsLCmb1ARnCUiOHrA==/728976219442072.jpg"},"audio":"http://m2.music.126.net/1_1fL10tcDS2w1NJVKgheg==/3400789480144333.mp3","djProgramId":0,"page":"http://music.163.com/m/song/433107116"},{"id":416384073,"name":"泡沫","artists":[{"id":12039174,"name":"歌児","picUrl":null}],"album":{"id":34729053,"name":"泡沫","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/_sKK-ssqpnEBQTbLPKHcbQ==/17788998626043241.jpg"},"audio":"http://m2.music.126.net/SeE9_GXIKXyfOMX1cXHi0A==/3440371886103584.mp3","djProgramId":0,"page":"http://music.163.com/m/song/416384073"},{"id":128091,"name":"泡沫","artists":[{"id":3901,"name":"李炆","picUrl":null}],"album":{"id":12387,"name":"泡沫","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/terFY4W9s38_QTud0jbPhQ==/584940186012248.jpg"},"audio":"http://m2.music.126.net/dtB-9SQjCSC7Iss3zodElg==/1028043371983985.mp3","djProgramId":0,"page":"http://music.163.com/m/song/128091"},{"id":30375654,"name":"泡沫","artists":[{"id":1049567,"name":"touteitei","picUrl":null}],"album":{"id":3100017,"name":"泡沫","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/EHxZiFzvl7BeM1TNiYGXlQ==/7755955022500485.jpg"},"audio":"http://m2.music.126.net/kh9AyWMcU4DrXBVxxqIwUg==/2536573327861472.mp3","djProgramId":0,"page":"http://music.163.com/m/song/30375654"},{"id":408814485,"name":"泡沫 ","artists":[{"id":12025504,"name":"KANATA雪","picUrl":null}],"album":{"id":34605032,"name":"中翻","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/utOaGP7Yyt6M-q9GuxwMxw==/18278281300381820.jpg"},"audio":"http://m2.music.126.net/fkbvVWLaJVFlwCEZq0rqTA==/3402988496921167.mp3","djProgramId":0,"page":"http://music.163.com/m/song/408814485"},{"id":425375780,"name":"泡沫。","artists":[{"id":0,"name":"Heroin-桃吉吉","picUrl":null}],"album":{"id":0,"name":"[DJ节目]Heroin-桃吉吉的DJ节目 第4期","artist":{"id":0,"name":"Heroin-桃吉吉","picUrl":null},"picUrl":"http://p1.music.126.net/Ws4yDskR40oxoeaIdBYrdQ==/1366692967684212.jpg"},"audio":"http://m2.music.126.net/Geg5Xuk3bYTbagzY6TzZGQ==/3417282150189937.mp3","djProgramId":792588512,"page":"http://music.163.com/m/song/425375780"},{"id":31193040,"name":"泡沫.","artists":[{"id":0,"name":"黄瓜将","picUrl":null}],"album":{"id":0,"name":"[DJ节目]黄瓜将的DJ节目 第40期","artist":{"id":0,"name":"黄瓜将","picUrl":null},"picUrl":"http://p1.music.126.net/wUCI2tK2BHuE7Ko_bDpOzw==/7748258441546685.jpg"},"audio":"http://m2.music.126.net/eY4DYwIQSmlG8sbt4d_dMA==/7813129627582235.mp3","djProgramId":9266058,"page":"http://music.163.com/m/song/31193040"},{"id":33251778,"name":"泡沫","artists":[{"id":1038374,"name":"iMoon","picUrl":null},{"id":0,"name":"邓紫棋","picUrl":null}],"album":{"id":3186777,"name":"中文DJ","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/NXb5n6kubTPfUgTjrM4Zmg==/7838418395489948.jpg"},"audio":"http://m2.music.126.net/bVuiixkj1cJsLnRc2Q-ScQ==/1386484179486091.mp3","djProgramId":0,"page":"http://music.163.com/m/song/33251778"},{"id":412493639,"name":"泡沫","artists":[{"id":12026277,"name":"马三爷","picUrl":null}],"album":{"id":34694306,"name":"《泡沫》remix","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1.music.126.net/E8G2qnbxAkmSlgjOTwda_w==/109951162892477452.jpg"},"audio":"http://m2.music.126.net/KNCUDbeH__gEHHagPVCTQg==/1409573916647192.mp3","djProgramId":0,"page":"http://music.163.com/m/song/412493639"}]},"code":200} http://s.music.163.com/search/get/?type=1&s=paomo&limit=10&offset=0

下面是解析的过程,我们会从中取出歌曲的name,artists,picUrl,audio-歌名,歌手,专辑图片,音频链接

try {
                JSONObject response = new JSONObject(searchResponse);
                JSONObject result = response.getJSONObject("result");
                JSONArray songs = result.getJSONArray("songs");
                if (netMusicList.size() > 0) netMusicList.clear();
                for (int i = 0; i < songs.length(); i++) {
                    JSONObject song = songs.getJSONObject(i);
                    //获取歌曲名字
                    String title = song.getString("name");
                    //获取歌词演唱者
                    String artist = song.getJSONArray("artists")
                            .getJSONObject(0).getString("name");
                    //获取歌曲专辑图片的url
                    String albumPicUrl = song.getJSONObject("album").getString(
                            "picUrl");
                    //获取歌曲音频的url
                    String audioUrl = song.getString("audio");
                    Log.d(TAG, "doenloadUrl = " + audioUrl);
                    //保存音乐信息的Map
                    Map<String, Object> item = new HashMap<>();
                    item.put("title", title);
                    item.put("artist", artist);
                    item.put("picUrl", albumPicUrl);
                    picUrlMap.put(title + artist, new SoftReference<String>(
                            albumPicUrl));
                    item.put("audio", audioUrl);
                    //将一条歌曲信息存入list中
                    netMusicList.add(item);
                }
                Log.d(TAG, "搜到" + netMusicList.size() + "首歌");

            } catch (JSONException e) {
                e.printStackTrace();
            }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值