使用Volley取得政府資料開放平台JSON格式

By | 2016-11-07

關於Volley類別庫

早期開發Android程式,連線到網路皆透過內建的 HttpURLConnection,或HttpClient,由於HttpURLConnection不怎麼好用,需要額外處理的事太多,除了改用第三方類別庫外,一部份開發者仍會使用內建的 Apache HttpClient 類別庫。

2013年Google I/O發表了Volley,Volley是個輕量的HTTP Request類別庫,用以取代HttpURLConnection及HttpClient,於是在推出 Android 6.0時,斷然移除內建的Apache HttpClient。Volley類別庫適合處理通訊頻繁且資料量不大的傳輸作業。

本例將從台北市政府資料開放平台下載「臺北捷運轉乘停車場座標」,並標示在地圖上。

一、導入類別庫

開啟專案,在build.gradle(Module: app) 導入類別庫 Volley,目前官方放到JCenter最後一版為 1.0.0,在此使用已修定一些bug的非官方版。

二、讀取開放資料 (open data)

政府資料開放平台提供了許多有用資訊,市面上不少好用的APP資料皆來自open data。在此,我們希望能取得台北捷運週邊停車場資訊,進而標示在地圖上。

第2行:資料來源政府開放平台 —「臺北捷運轉乘停車場座標」

第3行:使用JsonObjectRequest類別要求JSON資料。

第5-11行:Velloy採非同步作業,匿名類別 Response.Listener  監聽回應

第12-17行:匿名類別Response.ErrorListener 監聽錯誤

第16行:由於Velloy使用Queue(佇列)方式處理網路通訊,不須管它怎麼傳送、何時傳送,只要把工作加到Queue裡就行,當執行結束會自動通知匿名類別Response.Listener。實務應用上應在APP裡產生一個queue的Singleton物件,讓整個應用程式隨處可取得。為了測試方便,在此直接呼叫Volley.newRequestQueue,然後將jsonObjectRequest物件加進佇列。

最後別忘了在AndroidManifest.xml加上可存取網路權限。

此方法僅能取得 JsonObject,若回傳資料內容為 JsonArray 請改用 JsonArrayRequest,否則會執行onErrorResponse。

三、解析JSON內容、標示在地圖上

資料回傳如下圖所示:

mag_volley_open_data_json_01

從回傳資料內容可見,我們所要截取的內容為下方紅色區塊。

第3行:取得停車場資訊主體資料,放到JSONArray

第4-11行:逐筆取得停車場地點

第6-9行:將取得地點標示到地圖上

執行畫面:

mag_volley_open_data_json_02  mag_volley_open_data_json_03

版權聲明

本文章版權為郭香宜所有,授權範圍僅限綠豆湯網站使用,除Facebook之類社群等未更改本文章出處之分享行為不在此限,其他個人或公司未經作者同意,不得任意將本文章內容轉載至其他網站,或以任何形式重製,為以免觸犯著作權法,請尊重作者之智慧財產權。

 

相關文章:

9 thoughts on “使用Volley取得政府資料開放平台JSON格式

  1. abc

    Hank老師,請問有完整的Code嗎?
    看了一下,上面的Code似乎只是片段

    Reply
    1. Junior M Post author

      你好,我是小編,本文範例是小編為了介紹Volley類別庫而寫的,小範例的source code沒留,很抱歉。關於Volley和JSON解析的部份文章內應該都有,其他相關內容請參考文章前半部連結。

      Reply
  2. jason

    你好,想要請問一下
    如果使用volley抓取json資料時發生跨網域錯誤怎麼辦?
    我的json網址是local端的

    Reply
    1. Maggie Post author

      請先確定手機/模擬器可以透過http連上你的本機

      Reply
  3. billy

    這兩段程式碼是跟地圖寫在一起的嗎?

    Reply
  4. lazy

    關於JSONArray data = jsonObject.getJSONObject(“result”).getJSONArray(“results”); 這段
    如果我的資料開頭是像這樣 {“data”:{“data”:[{“seq”:1,”車站編號”:”R3″,”車站中文名稱”:”小港”,
    我改成JSONArray data = jsonObject.getJSONObject(“data”).getJSONArray(“data”);
    卻好像抓不到
    下面的addmaker 也改了
    另外資料開頭都沒有result 這類的東西又要如何寫呢? 剛學app很多不懂 麻煩大大了 感謝.

    Reply

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *