本节主要讲解: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(); } } }