階段一:解析JSON,:解析JSON
“階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。
最近學到解析JSON格式的網路資料,而作業也要求自己找一個天氣預報的API地址,然後解析其中JSON格式的資料。可能是因為找的是免費的API地址,在百度APIStore裡的,它那JSON返回樣本的資料,跟我擷取之後,打Log顯示出來的有些差異,這隻是吐槽一下哈。另外,推薦初學者到“彙總資料”這個網站看一下那裡的範例程式碼,寫得很規範,思路、註解都很清楚。
因為第一次做解析JSON,而且這個API的資料還蠻複雜,在解析、讀取的時候,寫著寫著就蒙圈了。所以這次主要是分享一下,我是如何理解解析JSON的方法和怎樣擷取其中的資料,資料格式由簡單到複雜。而其基本文法,可以查看百度百科,那裡面講得很詳細。
以下分析,都是基於這個假設,請求的資料都轉換為String類型,並儲存在content變數中。
1、{"resultcode": "200", "reason": "查詢成功!"}
這種情況最好理解,只要JSONObject response = new JSONObject(content)和String result = response.getString("resultcode");而我是這麼理解的,一對花括弧{}就代表一個對象,所以response是這條資料的JSONObject,當實現這個對象之後,就當作這個花括弧{}被去除掉了,這麼想得話,對於理解複雜的資料時或有協助。當“值”的位置(即冒號後面的字串)沒有任何括弧時,就可以調用get方法來取值。
2、{"resultcode": "200", "reason": "查詢成功!", "future": [ { "temperature": "28℃~36℃", "weather": "晴轉多雲" } ] }
而當“值”的位置有方括弧[]時(跟數組類似),就要用上一級的對象調用getJSONArray("future"),這裡就是response,當執行了這一步,也可以當作把方括弧去掉。方括弧[]裡,每一對花括弧{}也代表一個對象,它也有下標,也是從0開始。
所以取temperature的代碼是:
JSONObject response = new JSONObject(content);// ==> "resultcode": "200", "reason": "查詢成功!", "future": [ { "temperature": "28℃~36℃", "weather": "晴轉多雲" } ]
JSONArray future= response.getJSONArray("future");// ==> { "temperature": "28℃~36℃", "weather": "晴轉多雲" }
JSONObject futureObject= future.getJSONObject(0);// ==> "temperature": "28℃~36℃", "weather": "晴轉多雲"
String temperature= futureObject.getString("temperature");
3、{ "resultcode": "200",
"reason": "查詢成功!",
"today": { "city": "天津", "date_y": "2014年03月21日", "week": "星期五", "temperature": "8℃~20℃", "weather": "晴轉霾", "weather_id": { "fa": "00", "fb": "53" } },
"future": [ { "temperature": "28℃~36℃", "weather": "晴轉多雲", "weather_id": { "fa": "00", "fb": "01" }, "wind": "南風3-4級", "week": "星期一", "date": "20140804" },
{ "temperature": "28℃~36℃", "weather": "晴轉多雲", "weather_id": { "fa": "00", "fb": "01" }, "wind": "東南風3-4級", "week": "星期二", "date": "20140805" }
]
}
(1)讀"today"裡的"city"
JSONObject response = new JSONObject(content);// ==>同上
JSONObject today= reponse.getJSONObject("today");// ==> "city": "天津", "date_y": "2014年03月21日", "week": "星期五", "temperature": "8℃~20℃", "weather": "晴轉霾", "weather_id": { "fa": "00", "fb": "53" }
String city= today.getString("city");
(2)讀"future"的第二個"temperature"的"weather_id"的"fa"
JSONObject response = new JSONObject(content);// ==>同上
JSONArray future= response.getJSONArray("future");
JSONObject futureObject= future.getJSONObject(1);// ==> "temperature": "28℃~36℃", "weather": "晴轉多雲", "weather_id": { "fa": "00", "fb": "01" }, "wind": "東南風3-4級", "week": "星期二", "date": "20140805"
JSONObject weather_id= futureObject.getJSONObject("weather_id");// ==> "fa": "00", "fb": "01"
String id= weather_id.getString("fa");
總結:對於解析JSON,我是把它理解成是一個不斷去括弧的過程。先找到你要擷取的資料,然後從最外層開始,一層層的剝。有花括弧{}的就getJSONObect(除最外層的,最外層的是new JSONObject,這也是第一步要做的),有方括弧[]的就getJSONArray。直到“值”的位置沒有任何括弧時,就能讀取資料了。。