Java入門系列:處理Json格式數據


本節主要講解:

1)json格式數據處理方法

2)第三方工具包的使用方法

3)java集合數據類型

【項目任務】

編寫一個程序,顯示未來的天氣信息。

【知識點解析】

為了方便后面代碼的分析,先需要掌握幾個相關的知識。

1.什么是json格式數據

從結構上看,我們所見到的所有的數據(data)最終都可以分解成三種類型:

第一種類型是標量(scalar),也就是一個單獨的字符串(string)或數字(numbers),比如"北京"這個單獨的詞。
第二種類型是序列(sequence),也就是若干個相關的數據按照一定順序並列在一起,又叫做數組(array)或列表(List),比如"北京,上海"。
第三種類型是映射(mapping),也就是一個名/值對(Name/value),即數據有一個名稱,還有一個與之相對應的值,這又稱作散列(hash)或字典(dictionary),比如"首都:北京"。

json是一種數據格式規則,給出了一套上述三種結構的數據的描述規則,滿足這一規則的數據叫做json數據。

json規則如下:

1) 並列的數據之間用逗號(", ")分隔。
2) 映射用冒號(": ")表示。
3) 並列數據的集合(數組)用方括號("[]")表示。
4) 映射的集合(對象)用大括號("{}")表示。

上面四條規則,就是Json格式的所有內容。

比如,下面這句話:

"北京市的面積為16800平方公里,常住人口1600萬人。上海市的面積為6400平方公里,常住人口1800萬。"

寫成json格式就是這樣:

[
  {"城市":"北京","面積":16800,"人口":1600},
  {"城市":"上海","面積":6400,"人口":1800}
]

如果事先知道數據的結構,上面的寫法還可以進一步簡化:

[
  ["北京",16800,1600],
  ["上海",6400,1800]
]

有關json數據的更多介紹,請點擊查看

2.如何使用json格式數據

在java中,對於json格式的數據,不能直接使用,需要先進行解析。這個解釋過程包括將任何java格式的數據轉換成json格式數據,或將json格式數據轉換成java對象。目前有很多第三方json數據解析工具包,提供了非常方便的各種操作,可以直接使用到我們的程序中,自己不必親自編寫解析json的代碼了。這些json解析工具中,json-lib使用比較簡單,下面一起看看如何在自己程序中加入json-lib工具包。

一、介紹

JSON-lib包主要就是用來解析Json數據,在其官網http://www.json.org/上有詳細講解,有興趣的可以去研究。

二、下載jar依賴包

 這里以json-lib-2.3.jar包為例,此包需要依賴其它的工具包才能正常使用,程序中除了導入json-lib-2.3.jar包之外,其它依賴包也要導入進去。所有包如下圖:

這里順便給出要給下載地址:http://pan.baidu.com/s/1kVIrdEf

三、將工具包添加到工程中

首先,將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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM