本節主要講解:html
1)json格式數據處理方法java
2)第三方工具包的使用方法json
3)java集合數據類型api
【項目任務】數組
編寫一個程序,顯示將來的天氣信息。app
【知識點解析】eclipse
爲了方便後面代碼的分析,先須要掌握幾個相關的知識。工具
從結構上看,咱們所見到的全部的數據(data)最終均可以分解成三種類型:ui
第一種類型是標量(scalar),也就是一個單獨的字符串(string)或數字(numbers),好比"北京"這個單獨的詞。
第二種類型是序列(sequence),也就是若干個相關的數據按照必定順序並列在一塊兒,又叫作數組(array)或列表(List),好比"北京,上海"。
第三種類型是映射(mapping),也就是一個名/值對(Name/value),即數據有一個名稱,還有一個與之相對應的值,這又稱做散列(hash)或字典(dictionary),好比"首都:北京"。
json是一種數據格式規則,給出了一套上述三種結構的數據的描述規則,知足這一規則的數據叫作json數據。url
json規則以下:
1) 並列的數據之間用逗號(", ")分隔。 2) 映射用冒號(": ")表示。 3) 並列數據的集合(數組)用方括號("[]")表示。 4) 映射的集合(對象)用大括號("{}")表示。
上面四條規則,就是Json格式的全部內容。
好比,下面這句話:
"北京市的面積爲16800平方千米,常住人口1600萬人。上海市的面積爲6400平方千米,常住人口1800萬。"
寫成json格式就是這樣:
[ {"城市":"北京","面積":16800,"人口":1600}, {"城市":"上海","面積":6400,"人口":1800} ]
若是事先知道數據的結構,上面的寫法還能夠進一步簡化:
[
["北京",16800,1600],
["上海",6400,1800]
]
有關json數據的更多介紹,請點擊查看
在java中,對於json格式的數據,不能直接使用,須要先進行解析。這個解釋過程包括將任何java格式的數據轉換成json格式數據,或將json格式數據轉換成java對象。目前有不少第三方json數據解析工具包,提供了很是方便的各類操做,能夠直接使用到咱們的程序中,本身沒必要親自編寫解析json的代碼了。這些json解析工具中,json-lib使用比較簡單,下面一塊兒看看如何在本身程序中加入json-lib工具包。
1、介紹
JSON-lib包主要就是用來解析Json數據,在其官網http://www.json.org/上有詳細講解,有興趣的能夠去研究。
2、下載jar依賴包
這裏以json-lib-2.3.jar包爲例,此包須要依賴其它的工具包才能正常使用,程序中除了導入json-lib-2.3.jar包以外,其它依賴包也要導入進去。全部包以下圖:
這裏順便給出要給下載地址:http://pan.baidu.com/s/1kVIrdEf
3、將工具包添加到工程中
首先,將jar 複製到myeclispe 工做空間下的,項目目錄下!例如: 個人工程名叫 test, 工做空間在D:\MyProjects 因此只要把jar 複製到D:\MyProjects\test\下,而後,在myeclipse的項目「test」上右鍵 ->build path->config build path,顯示librars 選項卡 ,點擊add jars(在add 前,最後refresh 刷新下,不然你可能看不到你的項目名),將以上6個包逐個添加進去。添加完成後,項目結構以下:
添加完成後,在要用到json-lib工具的程序代碼頭部,將所要用到的類import進去便可。
下面例子是說明json工具的用法
package dataCollection; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSONArray jsonArray = JSONArray.fromObject( list ); System.out.println( jsonArray ); } }
上述代碼將鏈表list轉換成一個JSONArray對象,該對象包含的數據是json格式的數據:["first","second"]。
JSONArray jsonArray = JSONArray.fromObject( "['json','is','easy']" ); System.out.println( jsonArray ); // 輸出結果["json","is","easy"]
上述代碼是將一個字符串"['json','is','easy']"轉換成一個JSONArray對象,該對象所包含的數據是:["json","is","easy"]
package dataCollection; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONObject; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub String json = "{bool:true,integer:1,string:\"json\"}"; JSONObject jsonObject = JSONObject.fromObject( json ); System.out.println(jsonObject); } }
上述代碼是將一個字符串 "{bool:true,integer:1,string:\"json\"}"轉換成一個JSONObject對象,該對象所包含的數據是:{bool:true,integer:1,string:\"json\"}
想要了解json-lib包更詳細的用法,請點擊官網
將將來7每天氣信息在控制檯打印輸出,天天一行。
package dataCollection; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * 獲得將來7天的天氣(含今天) * * @author ww * */ public class Weather { public Weather(String Cityid) throws IOException, NullPointerException { String Ctiyid; URLConnection connectionData; StringBuilder sb; BufferedReader br;// 讀取data數據流 JSONObject jsonData; JSONObject info; // 鏈接中央氣象臺的API URL url = new URL("http://api.k780.com:88/?app=weather.future&weaid=" + Cityid + "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"); connectionData = url.openConnection(); connectionData.setConnectTimeout(1000); sb = new StringBuilder(); try { br = new BufferedReader(new InputStreamReader( connectionData.getInputStream(), "UTF-8")); String line = null; while ((line = br.readLine()) != null){ sb.append(line); } } catch (SocketTimeoutException e) { System.out.println("鏈接超時"); } catch (FileNotFoundException e) { System.out.println("加載文件出錯"); } String datas = sb.toString(); //解析json數據 jsonData = JSONObject.fromObject(datas); //info = jsonData.getJSONObject("result"); JSONArray ja = jsonData.getJSONArray("result"); // 獲得1到6天的天氣狀況 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for(int i = 0;i < ja.size();i++){ Map<String,Object> map = new HashMap<String,Object>(); JSONObject jobj = ja.getJSONObject(i); map.put("days", jobj.getString("days")); map.put("week", jobj.getString("days")); map.put("citynm", jobj.getString("citynm")); map.put("temperature", jobj.getString("temperature")); map.put("weather", jobj.getString("weather")); map.put("wind", jobj.getString("wind")); list.add(map); } // // 控制檯打印出天氣 for (int j = 0; j < list.size(); j++) { Map<String, Object> wMap = list.get(j); System.out.println(wMap.get("citynm") + "\t" + wMap.get("days") + "\t" + wMap.get("week") + "\t" + wMap.get("weather") + "\t" + wMap.get("temperature") + "\t" + wMap.get("wind")); } } public static void main(String[] args) { try { new Weather("101010100"); // 101010100(北京)就是你的城市代碼 } catch (Exception e) { e.printStackTrace(); } } }