王振鐸, 王振輝, 邊倩, 王英強(qiáng)
(1. 西安思源學(xué)院 電子信息學(xué)院, 西安 710038; 2. 西安翻譯學(xué)院 工程技術(shù)學(xué)院, 西安 710105)
農(nóng)業(yè)數(shù)據(jù)是關(guān)系著居民衣食、生態(tài)環(huán)保、健康醫(yī)療、工業(yè)生產(chǎn)的本源數(shù)據(jù)。但是,由于數(shù)據(jù)共享開放不足,信息孤島、數(shù)據(jù)壁壘、數(shù)據(jù)碎片化和信息不對(duì)稱等問題大量存在,直接制約了跨部門、跨區(qū)域和跨行業(yè)的互連互通、協(xié)作協(xié)同和科學(xué)決策。2015年8月31日,國(guó)務(wù)院發(fā)布的《促進(jìn)大數(shù)據(jù)發(fā)展行動(dòng)綱要》,2015年12月31日農(nóng)業(yè)部發(fā)布的《關(guān)于推進(jìn)農(nóng)業(yè)農(nóng)村大數(shù)據(jù)發(fā)展的實(shí)施意見》,均明確提出政府?dāng)?shù)據(jù)資源共享開放工程,及具體任務(wù),力求在未來(lái)五至十年內(nèi)實(shí)現(xiàn)農(nóng)業(yè)數(shù)據(jù)的有序共享開放,初步完成農(nóng)業(yè)數(shù)據(jù)化改造。
由于歷史上沒有重視數(shù)據(jù)的共享,原有歷史數(shù)據(jù)在數(shù)據(jù)格式、數(shù)據(jù)類型、存儲(chǔ)類型、存儲(chǔ)標(biāo)準(zhǔn)等方面仍然存在諸多問題。一是缺乏共享標(biāo)準(zhǔn)體系,沒有針對(duì)不同地區(qū)、不同行業(yè)、不同領(lǐng)域的數(shù)據(jù)格式匯交技術(shù),特別缺乏針對(duì)農(nóng)業(yè)多源異構(gòu)、結(jié)構(gòu)化、半結(jié)構(gòu)化數(shù)據(jù)的標(biāo)準(zhǔn)化技術(shù)和海量數(shù)據(jù)管理的模型技術(shù);二是缺乏不同平臺(tái)的整合技術(shù)。目前我國(guó)農(nóng)業(yè)存在諸多網(wǎng)站和數(shù)據(jù)平臺(tái),但是各個(gè)平臺(tái)之間層次不清晰、覆蓋內(nèi)容不一致,架構(gòu)布局不合理、尚不能實(shí)現(xiàn)互聯(lián)互通;三是缺乏便捷、高效的數(shù)據(jù)查詢、瀏覽、檢索、分發(fā)技術(shù)。目前我國(guó)已經(jīng)開放的一些數(shù)據(jù)平臺(tái)中,要么數(shù)據(jù)無(wú)法瀏覽,要么數(shù)據(jù)無(wú)法下載,要么數(shù)據(jù)鏈接不存在,平臺(tái)的便捷性和可訪問性較差。
針對(duì)異構(gòu)數(shù)據(jù)集成,朱峰針對(duì)互聯(lián)網(wǎng)金融應(yīng)用領(lǐng)域提出了一種基于JSON技術(shù)的異構(gòu)數(shù)據(jù)中間件系統(tǒng),設(shè)計(jì)了一種可擴(kuò)展的異構(gòu)數(shù)據(jù)整合框架JHD,構(gòu)建了中介模式和數(shù)據(jù)源模式以及它們的映射關(guān)系,以解決數(shù)據(jù)源的語(yǔ)義異構(gòu)問題,利用多個(gè)異構(gòu)數(shù)據(jù)源各自提供的數(shù)據(jù)服務(wù)接口,增加了系統(tǒng)的可擴(kuò)展性[1]。韓威威提出了一種利用XML技術(shù)解決語(yǔ)義沖突,利用Web Service架構(gòu)設(shè)計(jì)構(gòu)建異構(gòu)信息共享平臺(tái),以服務(wù)的方式為各終端用戶解決了農(nóng)業(yè)多源異構(gòu)數(shù)據(jù)共享的難題[2]。倪芳提出了一種 采用分布式 Web 服務(wù)中的 XML 技術(shù)對(duì)多源異構(gòu)農(nóng)業(yè)數(shù)據(jù)實(shí)現(xiàn)融合,能將抽象的農(nóng)業(yè)數(shù)據(jù)變得模型化,從而有效解決當(dāng)前農(nóng)業(yè)不同領(lǐng)域的數(shù)據(jù)整合與交互問題[3]。
綜上所述,目前進(jìn)行異構(gòu)數(shù)據(jù)信息集成的技術(shù)主要集中在XML技術(shù)上,比較新的系統(tǒng)采用了JSON技術(shù),本文工作是利用JSON作為異構(gòu)數(shù)據(jù)集成的中間件,解決多源異構(gòu)數(shù)據(jù)信息共享的難題。
JSON(JavaScript Object Notation)一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性??稍诓煌脚_(tái)之間進(jìn)行數(shù)據(jù)交換。JSON采用兼容性很高的、完全獨(dú)立于語(yǔ)言文本格式,同時(shí)也具備類似于C語(yǔ)言的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)體系的行為。這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。
XML(可擴(kuò)展的標(biāo)記語(yǔ)言)格式統(tǒng)一,符合標(biāo)準(zhǔn);容易與其他系統(tǒng)進(jìn)行遠(yuǎn)程交互,數(shù)據(jù)共享比較方便。但是它具有文件龐大,文件格式復(fù)雜,傳輸占帶寬;服務(wù)器端和客戶端都需要花費(fèi)大量代碼來(lái)解析XML,導(dǎo)致服務(wù)器端和客戶端代碼變得異常復(fù)雜且不易維護(hù);客戶端不同瀏覽器之間解析XML的方式不一致,需要重復(fù)編寫很多代碼;
相比之下,JSON具有數(shù)據(jù)格式比較簡(jiǎn)單,易于讀寫,格式都是壓縮的,JSON相對(duì)于XML來(lái)講,數(shù)據(jù)的體積小,傳遞的速度更快些占用帶寬小;易于解析,客戶端JavaScript可以簡(jiǎn)單的通過eval()進(jìn)行JSON數(shù)據(jù)的讀取;支持多種語(yǔ)言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務(wù)器端語(yǔ)言,便于服務(wù)器端的解析;同時(shí),因?yàn)镴SON格式能直接為服務(wù)器端代碼使用,大大簡(jiǎn)化了服務(wù)器端和客戶端的代碼開發(fā)量,且完成任務(wù)不變,并且易于維護(hù)。JSON與JavaScript的交互更加方便,更容易解析處理,更好的數(shù)據(jù)交互。下面,通過實(shí)例比較XML和JSON:
例如:用XML表示中國(guó)部分省市數(shù)據(jù)如下:
<2>.用JSON表示中國(guó)部分省市數(shù)據(jù)如下:
var country =
{
name: "中國(guó)",
provinces: [
{ name: "陜西", citys: { city: ["西安", "寶雞"]} },
{ name: "漢南", citys: { city: ["鄭州", "洛陽(yáng)"]} }
}
從上面實(shí)例可以看出,XML的結(jié)構(gòu)化形式利于程序的閱讀。而JSON讀起來(lái)更像一個(gè)數(shù)據(jù)塊,讀起來(lái)就比較費(fèi)解,然而這一點(diǎn)非常適合機(jī)器閱讀,所以通過JSON的索引country.provinces[0].name就能夠讀取“陜西”這個(gè)值。并且,XML數(shù)據(jù)中包含很多重復(fù)的標(biāo)記字符,而JSON中僅僅存在的是密密麻麻的有用數(shù)據(jù)。
中間件模式通過統(tǒng)一的全局?jǐn)?shù)據(jù)模型來(lái)訪問異構(gòu)的數(shù)據(jù)庫(kù)、遺留系統(tǒng)、Web 資源等。中間件位于異構(gòu)數(shù)據(jù)源系統(tǒng)(數(shù)據(jù)層) 和應(yīng)用程序(應(yīng)用層) 之間,向下協(xié)調(diào)各數(shù)據(jù)源系統(tǒng),向上為訪問集成數(shù)據(jù)的應(yīng)用提供統(tǒng)一數(shù)據(jù)模式和數(shù)據(jù)訪問的通用接口。各數(shù)據(jù)源的應(yīng)用仍然完成它們的任務(wù),中間件系統(tǒng)則主要集中為異構(gòu)數(shù)據(jù)源提供一個(gè)高層次檢索服務(wù)。
中間件模式是比較流行的數(shù)據(jù)集成方法,它通過在中間層提供一個(gè)統(tǒng)一的數(shù)據(jù)邏輯視圖來(lái)隱藏底層的數(shù)據(jù)細(xì)節(jié),使得用戶可以把集成數(shù)據(jù)源看為一個(gè)統(tǒng)一的整體。這種模型下的關(guān)鍵問題是如何構(gòu)造這個(gè)邏輯視圖并使得不同數(shù)據(jù)源之間能映射到這個(gè)中間層。根據(jù)此原理,我們?cè)O(shè)計(jì)了基于JSON的異構(gòu)數(shù)據(jù)中間件系統(tǒng),如下圖1所示:
圖1 JSON異構(gòu)數(shù)據(jù)集成中間件
為了構(gòu)建異構(gòu)數(shù)據(jù)集成平臺(tái),需要將各異構(gòu)數(shù)據(jù)庫(kù)中的數(shù)據(jù)取出來(lái),進(jìn)行數(shù)據(jù)格式的統(tǒng)一,以便JSON 異構(gòu)數(shù)據(jù)集成中間件進(jìn)行進(jìn)一步處理。下面以Java Web開發(fā)為例。
數(shù)據(jù)庫(kù)中數(shù)據(jù)轉(zhuǎn)換成JSON數(shù)據(jù)分為兩步,首先將java對(duì)象保存在JSON中; 然后通過Ajax來(lái)得到JSON轉(zhuǎn)化成js對(duì)象的數(shù)據(jù),以便在Web頁(yè)面中顯示。關(guān)鍵代碼如下:
<%@ page import=java.io.Writer%>
<%@ page import="org.json.JSONArray"%>
<%@ page import="org.json.JSONObject"%>
public class Tsdh {
private String depname;
private String name;
private String tel;
//這幾個(gè)屬性的get和set方法省略
}
JSONArray jsons=new JSONArray();
try{
Tsdh tsdh=new Tsdh();
tsdh.setDepname("辦公室");
tsdh.setName("大熊");
tsdh.setTel("0431-1111111");
Tsdh tsdh2=new Tsdh();
tsdh2.setDepname("行政部");
tsdh2.setName("柯基");
tsdh2.setTel("0431-2222222");
JSONObject json=new JSONObject(tsdh);
JSONObject json1=new JSONObject(tsdh2);
jsons.put(json);
jsons.put(json1);
response.setContentType("text/html;charset=utf-8");
Writer writer=response.getWriter();
writer.writer(jsons.toString);
writer.flush();
writer.close();
writer=null;
}catch(Exception e){
System.out.println("error: "+e);
}
}
Html代碼 AJAX處理代碼
function createXMLHttpRequest(){
var xmlHttp;
if(window.ActiveObject){
xmlHttp=new ActiveObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}
return xmlHttp;
}
function getTestInfo(){
var xmlHttp=createXMLHttpRequest();
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
var myJson=eval("("+xmlHttp.responseText+")");
if(null!=myJson &&""!=myJson && myJson.length>0){
for(var i=0;i alert(myJson[i].name+"--"+myJson[i].depname+"--"+myJson[i].tel); } } } } } xmlHttp.open("post","getValue.jsp"); xmlHttp.send(null); } 通過異構(gòu)數(shù)據(jù)中間件,將用戶輸入的數(shù)據(jù)存入各異構(gòu)數(shù)據(jù)庫(kù)的步驟是: 1.在用戶端在處理量數(shù)據(jù)提交的表單時(shí),可以使用Ajax提交,并將數(shù)據(jù)轉(zhuǎn)換成JSON格式,使用jquery.serializeJSON,可以在基于jQuery技術(shù)實(shí)現(xiàn)。 2.頁(yè)面中,調(diào)用 .serializeJSON() 方法來(lái)序列化form表單的數(shù)據(jù)成JS對(duì)象。 3.將JS對(duì)象轉(zhuǎn)換成實(shí)體類。調(diào)用JSONObject 的toBean方法。示例代碼如下: for(Object obj : arr){ JSONObject jsonObject =JSONObject.fromObject(obj); EnterpriseInfoEntity entInfo = (EnterpriseInfoEntity)JSONObject.toBean(jsonObject, EnterpriseInfoEntity.class); } 4.使用ORM技術(shù),將實(shí)體映射到相應(yīng)的關(guān)系表中,實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)。 利用Java技術(shù)實(shí)現(xiàn)的該農(nóng)業(yè)異構(gòu)數(shù)據(jù)集成平臺(tái),具有平臺(tái)無(wú)關(guān)性、安全性等特點(diǎn)。通過系統(tǒng)測(cè)試,可以兼容SQL Server、MySql、Oracle等大型關(guān)系庫(kù)。 JSON (JavaScriptObject Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,主要用于傳送數(shù)據(jù)。JSON采用了獨(dú)立于語(yǔ)言的文本格式,類似XML,但是比XML簡(jiǎn)單,易讀并且易編寫。對(duì)機(jī)器來(lái)說易于解析和生成,并且會(huì)減少網(wǎng)絡(luò)帶寬的傳輸。由于JSON格式可以解耦javascript客戶端應(yīng)用與服務(wù)器端的方法調(diào)用,因而在互聯(lián)網(wǎng)應(yīng)用中被大量使用。所以,系統(tǒng)采用JSON技術(shù),將異構(gòu)數(shù)據(jù)統(tǒng)一成JSON格式輸出顯示,和將用戶數(shù)據(jù)轉(zhuǎn)換成JSON格式對(duì)象保存到異構(gòu)數(shù)據(jù)庫(kù)。以此為基礎(chǔ)構(gòu)建的數(shù)據(jù)集成中間件,具有易實(shí)施,擴(kuò)展性強(qiáng)等優(yōu)點(diǎn),為從事異構(gòu)數(shù)據(jù)集成提供了借鑒。4.2 把JSON數(shù)據(jù)存放到數(shù)據(jù)庫(kù)
5 系統(tǒng)特點(diǎn)
6 總結(jié)