通过服务器返回来JSON歌词数据进行解析

来源:互联网 发布:mac转音频格式 编辑:程序博客网 时间:2024/06/10 05:36

      前言:很多初学者学到一定的知识时候,会想说 我们从服务端怎么接受数据,最近在做一个音乐播放器,前段时间自己弄了自定义歌词滚动,后来发现 这个满足不了,歌词文件怎么办,想到了去服务器下载。于是我找了很多 比如说QQ音乐,百度音乐,酷狗音乐,好像都没有提供API ,最后找到了一个交歌词迷的API。虽然资源比较少,但是凑合着用,毕竟免费的,接下来 来展示下从服务器如何接受数据。

              从服务器接收回来的数据一般有两种格式 一种是json/xml

            JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#Java、JavaScript、PerlPython等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。     

          XML

可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输


      上面我就从百度百科拿出来 简单的介绍下两种传输格式,今天来讲的是JSON。首先来介绍下歌词迷这个API接口:

       API接口网址:http://www.devapi.org/lyric-fans.html#item2

      接下里来介绍下返回的JSON数据介绍:


   

         HTTP(GET) / GBK,UTF-8    这个就不用说了会点网络编程都知道

      2.接口返回值类型

         JSON

      3.根据歌名/歌手获取JSON数据

          请求的地址:http://geci.me/api/lyric/ SongName  (这里的SongName 指的是歌名) 

               请求的地址:http://geci.me/api/lyric/ SongName/Artist  (这里的SongName 指的是歌名,Artist指的是歌手名

            接下来我们看下实际的操作:

        比如说我们请求

                            http://geci.me/api/lyric/海阔天空       

            则我们会接收到网页返回来一串字符串:

{    "count": 15,    "code": 0,    "result":        [            {"aid": 1563419, "lrc": "http://s.geci.me/lrc/166/16685/1668536.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1668536},            {"aid": 1571906, "lrc": "http://s.geci.me/lrc/167/16796/1679605.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1679605},            {"aid": 1573814, "lrc": "http://s.geci.me/lrc/168/16819/1681961.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1681961},            {"aid": 1618733, "lrc": "http://s.geci.me/lrc/174/17407/1740790.lrc", "artist": "\u5468\u534e\u5065", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1740790},            {"aid": 1656038, "lrc": "http://s.geci.me/lrc/179/17907/1790768.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1790768},            {"aid": 1718741, "lrc": "http://s.geci.me/lrc/187/18757/1875769.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 1875769},            {"aid": 1889264, "lrc": "http://s.geci.me/lrc/210/21070/2107014.lrc", "artist": "\u8d39\u7fd4", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2107014},            {"aid": 2003267, "lrc": "http://s.geci.me/lrc/226/22642/2264296.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2264296},            {"aid": 2020610, "lrc": "http://s.geci.me/lrc/228/22889/2288967.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2288967},            {"aid": 2051678, "lrc": "http://s.geci.me/lrc/233/23323/2332322.lrc", "artist": "Beyond", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2332322},            {"aid": 2075717, "lrc": "http://s.geci.me/lrc/236/23651/2365157.lrc", "artist": "\u8d39\u7fd4", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2365157},            {"aid": 2253359, "lrc": "http://s.geci.me/lrc/261/26128/2612812.lrc", "artist": "\u9ec4\u79cb\u751f", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2612812},            {"aid": 2319680, "lrc": "http://s.geci.me/lrc/270/27055/2705565.lrc", "artist": "\u4efb\u8d24\u9f50", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2705565},            {"aid": 2346662, "lrc": "http://s.geci.me/lrc/274/27442/2744281.lrc", "artist": "\u6797\u5b50\u7965", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2744281},            {"aid": 2412272, "lrc": "http://s.geci.me/lrc/283/28370/2837015.lrc", "artist": "DJ Tommy", "song": "\u6d77\u9614\u5929\u7a7a", "sid": 2837015}        ]}
       

            这样的一串字符串则为JSON,至于如何解析等下再来。获取到网页这么一串字符串我们最后怎么解析。

           首先我们要先获取到这么一串字符串,当然是通过URL网页请求来获取内容:

    

public static String NewToolString(String path)    {DefaultHttpClient client1 = new DefaultHttpClient();/** NameValuePair是传送给服务器的请求参数 param.get("name") **/UrlEncodedFormEntity entity1 = null;/** 新建一个get请求 **/HttpGet get = new HttpGet(path);HttpResponse response1 = null;String strResult1 = "";try{    /** 客服端向服务器发送请求 **/    response1 = client1.execute(get);} catch (ClientProtocolException e){    e.printStackTrace();} catch (IOException e){    // TODO Auto-generated catch block    e.printStackTrace();}/** 请求发送成功,并得到响应 **/if (response1.getStatusLine().getStatusCode() == 200){    try    {/** 读取服务器返回过来的json字符串数据 **/strResult1 = EntityUtils.toString(response1.getEntity());return strResult1;    } catch (IllegalStateException e)    {// TODO Auto-generated catch blocke.printStackTrace();    } catch (IOException e)    {// TODO Auto-generated catch blocke.printStackTrace();    }}return  "";    }

      参数path:则为我们传进去的请求网页比如      http://geci.me/api/lyric/童话/光良 

       获取到这么一串字符串,我们就要开始解析,这里我就简单的提一下解析,想要更深入了解可以去看书籍以及视频,

记得我很早之前学习的时候是通过老罗的视频第一季学习的。


     JSON格式 都是以键值对存在   一个{}为一个JSON对象 当然{}里面还可以嵌套一个{} 或[] 数组

  {

       “count”:1;

        “code”:0

       "result":

            [

               {},

                {}

             ]

 从上面可以看出 result 是一个数组 数组里面都为一个JSON对象  一次类推,通过JSON数组的下标继续访问里面的键值对

具体怎么访问,接下来 铁代码

 public static void getInfors(String jString)    {            try{    JSONObject jsonObject = new JSONObject(jString);    int count = jsonObject.getInt("count");    Log.i("TAG", count + "");    int code = jsonObject.getInt("code");    Log.i("TAG", code + "");    // JSONObject result=jsonObject.getJSONObject("result");    JSONArray result = jsonObject.getJSONArray("result");    if (result.length() != 0)    {for (int i = 0; i < result.length(); i++){    JSONObject jsonObject2 = result.getJSONObject(i);    int aid = jsonObject2.getInt("aid");    Log.i("TAG", aid + "");    String lrc = jsonObject2.getString("lrc");    Log.i("TAG", lrc);    String song = jsonObject2.getString("song");    Log.i("TAG", song);    int artist_id = jsonObject2.getInt("artist_id");    Log.i("TAG", artist_id + "");    int sid = jsonObject2.getInt("sid");    Log.i("TAG", sid + "");}    }} catch (JSONException e){    // TODO Auto-generated catch block    e.printStackTrace();}     }

             代码为什么这羊可以去琢磨一下,这里不做解析,重点是讲从服务器怎么获取怎么解析。

    

            

        我用日志打出了崔后解析的结果 就像上图一样。

          其他的API接口也是一样的使用。只是服务器返回的信息不一样 解析的信息不一样而已,

         

     

      
 

1 0
原创粉丝点击