999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

JSON與XML動態(tài)轉(zhuǎn)換研究及應(yīng)用

2018-11-19 11:05:46趙建軍張錦鵬
軟件導(dǎo)刊 2018年11期
關(guān)鍵詞:智慧

劉 立,趙建軍,張錦鵬,余 進(jìn)

(昆明理工大學(xué) 理學(xué)院,云南 昆明 650500)

0 引言

智慧城市是以互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、電信網(wǎng)、廣電網(wǎng)、無線寬帶網(wǎng)等網(wǎng)絡(luò)組合為基礎(chǔ),以智慧技術(shù)高度集成、智慧產(chǎn)業(yè)高端化發(fā)展、智慧服務(wù)高效便民為主要特征的城市發(fā)展新模式。智慧城市核心是運用信息和通信技術(shù)手段感測、分析、整合城市運行核心系統(tǒng)的各項關(guān)鍵信息[1]。

感知層是智慧城市體系對現(xiàn)實世界進(jìn)行感知、識別和信息采集的基礎(chǔ)性物理網(wǎng)絡(luò),海量的數(shù)據(jù)在感知層產(chǎn)生[2]。由于智慧城市的飛速發(fā)展,基于物聯(lián)網(wǎng)的應(yīng)用愈加豐富,客戶端和服務(wù)器端數(shù)據(jù)交換方式也越來越多[3]。在相關(guān)AJAX[4](Asynchronous Java Script and XML)應(yīng)用中,XML和JSON是主要數(shù)據(jù)交換格式。為了更好實現(xiàn)數(shù)據(jù)交換,選擇合適的數(shù)據(jù)轉(zhuǎn)換格式對實現(xiàn)數(shù)據(jù)轉(zhuǎn)換、保障應(yīng)用程序性能至關(guān)重要[5]。JSON具有規(guī)則簡單、便于學(xué)習(xí)的特點,且配有多種語言開發(fā)包,在項目中易于使用。無論是使用JavaScript還是其它編程語言,操作JSON的代碼量都相對較少。由于占用空間小、處理速度快,使JSON在AJAX應(yīng)用中優(yōu)勢明顯,在Web服務(wù)與數(shù)據(jù)存儲方面有很大的發(fā)展空間。XML更常見于企業(yè)應(yīng)用。嚴(yán)格的規(guī)范與眾多周邊技術(shù)使XML 應(yīng)用范圍易于擴(kuò)展,同時大量商業(yè)化應(yīng)用程序支持XML,使非IT人員可以較為容易地編寫、閱讀XML。有些傳感器獲取的文件是以JSON格式存儲于服務(wù)器,為了將傳感器獲取的數(shù)據(jù)進(jìn)行實時可視化,需要將JSON格式文件實時、動態(tài)地轉(zhuǎn)換為XML格式文件,以便Web端解析調(diào)用,最終實現(xiàn)在前端頁面實時展示。本設(shè)計通過實現(xiàn)動態(tài)JSON轉(zhuǎn)XML并自定義轉(zhuǎn)換JSON文件內(nèi)容,實現(xiàn)感知層獲取數(shù)據(jù)的有效利用。

1 JSON與XML

1.1 JSON

JSON[6](JavaScript Object Notation)是一種輕量級數(shù)據(jù)交換格式,可在多種語言之間進(jìn)行數(shù)據(jù)交換,易于讀寫和機(jī)器解析、生成。 作為基于JavaScript Programming Language(Standard ECM A - 262 3rd Edition - December 1999)的一個子集,JSON采用完全獨立于語言的文本格式,但因具有類似于C語言家族的特點(C、C++、C#、JAVA、JavaScript、Perl、Python等),使JSON成為理想的數(shù)據(jù)交換語言[7]。

JSON規(guī)則簡單,使用壓縮格式,占用帶寬小,多用于服務(wù)器中,JSON字符串由帶雙引號的Unicode字符集合組成,字符數(shù)量不受限制,單個字符也是一個字符串,其中JSON對象是一個無序的“名稱/值”集合,每個“名稱/值”之間使用逗號“,”分隔。每個名稱使用雙引號“”””括起來,“名稱”后跟著一個冒號“:”,冒號后是值[8-10]。本設(shè)計中用于轉(zhuǎn)換的JSON文本數(shù)據(jù)如下所示:

{"eventId":"1","tid":" C0900000000B6 9D8EA010000000059C5","epc":"04FFC0900000000B 123254321111111155555555555500000000000000000000","firstSeenTime":"1494852436826","lastSeenTime":"1494852437122","seenCount":"28","readerId":"3000000041","antennaNo":"1","monitorId":"HQSJ2LINE","roadNo":"81896","laneNo":"S1E"}。

1.2 XML

可擴(kuò)展標(biāo)識語言[11](Extensible Markup Language, XML)源自標(biāo)準(zhǔn)通用標(biāo)記語言SGML,1995年發(fā)展出雛形,并向W3C提案,于1998年2月發(fā)布為W3C標(biāo)準(zhǔn)(XML1.0)。XML是Internet環(huán)境中依賴內(nèi)容的跨平臺技術(shù),能高效處理現(xiàn)今的結(jié)構(gòu)化文檔信息[12-13]。作為一種允許用戶對標(biāo)記語言進(jìn)行定義的源語言,XML既可以用于標(biāo)記數(shù)據(jù)也可定義數(shù)據(jù)類型,目前已在電子商務(wù)、無線通信、數(shù)字圖書館、多媒體數(shù)據(jù)庫和資料庫等領(lǐng)域廣泛應(yīng)用[14]。XML使用元素和屬性描述數(shù)據(jù)。在數(shù)據(jù)傳送過程中,XML 始終保留了諸如父/子關(guān)系等數(shù)據(jù)結(jié)構(gòu)。多個應(yīng)用程序可以共享和解析同一個XML文件,不必使用傳統(tǒng)字符串解析或拆解。相反,普通文件不描述每個數(shù)據(jù)段(除頭文件中外),也不保留數(shù)據(jù)關(guān)系結(jié)構(gòu)。使用XML進(jìn)行數(shù)據(jù)交換可以使應(yīng)用程序更有彈性,因為可以用位置(與普通文件一樣) 或元素名(從數(shù)據(jù)庫)存取XML數(shù)據(jù)。Web服務(wù)讓使用不同操作系統(tǒng)和不同編程語言的人們能夠互相交流和分享數(shù)據(jù),其前提是各Web服務(wù)器使用XML文件在各系統(tǒng)之間交換數(shù)據(jù)。

XML不提供數(shù)據(jù)的顯示方法,只用節(jié)點和屬性描述數(shù)據(jù),因此XML提供了一個標(biāo)記獨立于平臺和語言內(nèi)容的有效方法[15]。使用XSLT[16]語言能輕易地將XML文件轉(zhuǎn)換成各種格式文件,XML能夠運行于不同系統(tǒng)平臺之間和轉(zhuǎn)換成不同格式目標(biāo)文件的能力使其成為內(nèi)容管理應(yīng)用系統(tǒng)中的重要格式,其中XML文件中每個文檔必須有開始和結(jié)束標(biāo)簽。JSON文件轉(zhuǎn)換為XML文件的顯示形式如下所示:

04FFC0900000000B

123254321111111155555555555500000000000000000000

C0900000000B69D8EA

010000000059C5

1.3 JSON與XML分析

JSON和XML都是開放式數(shù)據(jù)交換,二者既有可通用的方面,也有不同之處。相對于JSON而言,XML屬于重量級數(shù)據(jù)格式[17]。二者都具有與編程語言無關(guān)性的特點,目前常用于異構(gòu)應(yīng)用程序之間數(shù)據(jù)傳遞。具體相關(guān)特性比較如表1所示[18]。

表1 JSON與XML特性比較

針對JSON和XML的優(yōu)缺點,根據(jù)不同情況采用對應(yīng)的文件格式描述數(shù)據(jù)。智慧城市中感知層獲取的數(shù)據(jù)可以利用占用內(nèi)存小的JSON文件保存,而實現(xiàn)數(shù)據(jù)可視化需要利用XML文件進(jìn)行解析,由于XML利用標(biāo)記語言的特性實現(xiàn)了良好的延展性,在數(shù)據(jù)存儲、擴(kuò)展以及高級檢索方面具備JSON無法比擬的優(yōu)勢[19]。因此,實現(xiàn)實時展現(xiàn)傳感器獲取數(shù)據(jù)需要實時動態(tài)地將JSON文件轉(zhuǎn)換為XML文件,以便Web前端解析,從而實現(xiàn)在前端頁面顯示。

2 JSON與XML動態(tài)轉(zhuǎn)換實現(xiàn)

為實現(xiàn)模塊化、結(jié)構(gòu)化設(shè)計,使系統(tǒng)各部分保持相對獨立,最大程度降低耦合,提高系統(tǒng)擴(kuò)展性和靈活性[20],首先通過服務(wù)器讀取待處理的JSON文件,然后對其進(jìn)行序列化轉(zhuǎn)換,生成JSON字符串;再將JSON字符串轉(zhuǎn)換為MAP鍵值對,對其中的內(nèi)容進(jìn)行修改、刪除,即實現(xiàn)自定義數(shù)據(jù);最后將轉(zhuǎn)換后的JSON文件轉(zhuǎn)為XML文件,保存到指定位置以便Web前端解析使用。為了實現(xiàn)動態(tài)化整個設(shè)計采用JAVA線程處理,即每隔3秒進(jìn)行刷新,掃描文件夾是否存有JSON文件,如果有則繼續(xù)進(jìn)行轉(zhuǎn)換。圖1為實現(xiàn)模塊化設(shè)計的流程結(jié)構(gòu)。

圖1 模塊設(shè)計流程

2.1 JSON文件讀取

public static File test(File f) {

File[] files = f.listFiles();

for (File file : files) {

File file2 = new File(file.getPath());

if (file2.isDirectory()) {

test(file2);

} else if (file.getName().endsWith(".json")) {

System.out.println(file.getPath());

}

}

return f;

}

本代碼段可以實現(xiàn)從一個指定的文件夾讀取JSON格式的文本文件,從而確定JSON文件動態(tài)轉(zhuǎn)XML文件的數(shù)據(jù)來源。本方法也可擴(kuò)展應(yīng)用到從文件夾中獲取其它格式的文件。

2.2 JSON文件向Map轉(zhuǎn)換

將JSON文件轉(zhuǎn)換為Map,主要用于修改和刪除JSON文件,實現(xiàn)轉(zhuǎn)換的可裁剪性,最終獲取轉(zhuǎn)換后的JSON文件內(nèi)容,操作主要包含兩部分:

(1)修改。

monitorId: HQSJ2LINE(YNZZ

lastSeenTime: 1494852437122(2017-05-15 20:47:45,即對獲取的時間字符串進(jìn)行時間格式化轉(zhuǎn)換。

(2)刪除。刪除不需要轉(zhuǎn)換的JSON信息,例如:firstSeenTime、eventId、antennaNo、readerId,即刪除原有冗余數(shù)據(jù)lastSeenTime和epc。

public static Map jsonToMaoString(String jsonStr) {

Map map = new HashMap();

JSONObject json = JSONObject.fromObject(jsonStr);

for (Object k : json.keySet()) {

Object v = json.get(k);

if (null != v) {

map.put(k.toString(), v.toString());

map.put("monitorId", "YNZZ");

String s = map.get("lastSeenTime");

if(s!=null){

System.out.println(s);

long a = Long.parseLong(s);

Date date = new Date(a);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ptime = sdf.format(date);

map.put("discoveredTime", ptime);}

String epc = map.get("epc");

if(epc!=null){

map.put("rfidPlate", epc);

map.put("tempPlate", epc);}

map.remove("lastSeenTime");

map.remove("firstSeenTime");

map.remove("eventId");

map.remove("antennaNo");

map.remove("readerId");

map.remove("epc");}}

return map;}

2.3 Map向JSON轉(zhuǎn)換

Map value = jsonToMaoString(buffer.toString());

JSONObject jsonnew = JSONObject.fromObject (value);

本段代碼是從Map轉(zhuǎn)換后再轉(zhuǎn)為自定義后的JSON字符串,即經(jīng)過刪減和修改后的字符串。

2.4 JSON向XML轉(zhuǎn)換

publicstatic String jsonToXML(JSONObject json) {

JSONObject jobj = JSONObject.fromObject(json);

String xml = SERIALIZER.write(jobj);

return xml; }

本段代碼實現(xiàn)了將JSON字符串轉(zhuǎn)換為XML字符串。

2.5 XML文件保存

public static void writeStrToFile(String str, String path)

throws IOException {

Scanner input = new Scanner(str + " ");

FileOutputStream fos = new FileOutputStream(path);

while (input.hasNext()) {

String a = input.next();

fos.write((a + " ").getBytes());

}

fos.close();

input.close(); }

本段代碼主要實現(xiàn)將轉(zhuǎn)換后的XML文件存儲到對應(yīng)的文件夾中,以滿足Web調(diào)用。本方法也可實現(xiàn)將字符串保存為其它格式,只需要在保存路徑中添加要保存的后綴即可實現(xiàn)。

2.6 JSON與XML文件動態(tài)轉(zhuǎn)換

采用單線程實現(xiàn)JSON與XML文件的動態(tài)轉(zhuǎn)換,即從本地文件夾讀取JSON文件,再轉(zhuǎn)換為XML文件,然后將獲取的XML文件存儲到本地,在運行過程中動態(tài)刪除已經(jīng)轉(zhuǎn)換的JSON文件,利用線程定時掃描文件夾,如果掃描到新的JSON文件,則重復(fù)以上操作,進(jìn)行實時轉(zhuǎn)換。

publicvoid run() {

File json = new File("D:\ynzz\ynzziot\jsonxmll");

File[] json1 = test(json).listFiles();

for (File fj : json1) {

File fj2 = new File(fj.getPath());

if (fj2.isDirectory()) {

test(fj2);

} elseif

(fj.getName().endsWith(".json")) {

Scanner scanner = null;

StringBuilder buffer = new StringBuilder();

try {

scanner = new Scanner(fj2, "utf-8");

while (scanner.hasNextLine()) {

buffer.append(scanner.nextLine());}

}catch(FileNotFoundException e) {

} finally {

if (scanner != null) {

scanner.close();}}

System.out.println(

"json=" + buffer.toString());

Map value =

jsonToMaoString(buffer.toString());

JSONObject jsonnew = JSONObject.fromObject(value);

String xmlnew = jsonToXML(jsonnew);

long time = System.currentTimeMillis();

try {

writeStrToFile(xmlnew,"D:\ynzz\ynzziot\xml2\"+jsonnew.getString("tid")+"ynzz"+time+".xml");

} catch (IOException e1) {

e1.printStackTrace();}

fj2.delete();//原始json文件刪除

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace(); }}} }

2.7 在main函數(shù)中的實現(xiàn)

publicstaticvoid main(String[] args) throws IOException, JSONException {

while(true){

Thread t1 = new Json2Xml();

t1.start();

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace(); } } }

本段代碼主要啟動線程,進(jìn)行JSON與XML動態(tài)轉(zhuǎn)換,其中采用while(true)循環(huán)實現(xiàn)程序可以保持一直運行狀態(tài),從而使得JSON動態(tài)轉(zhuǎn)換為XML。在實際運用中,將以上實現(xiàn)過程打成jar包,用戶只需啟動jar包即可從某一指定位置讀取JSON文件,然后經(jīng)過jar包轉(zhuǎn)換成XML文件后存儲到另一指定位置。

3 結(jié)語

本文基于智慧城市發(fā)展中感知層的應(yīng)用,對感知層多傳感器源數(shù)據(jù)處理的不同數(shù)據(jù)交換格式進(jìn)行了研究。通過序列化JSON字符串,深入分析MAP鍵值對,剔除冗余鍵值對,從而將修改后的MAP鍵值對再轉(zhuǎn)為自定義后的JSON字符串,然后在重新自定義JSON字符串的基礎(chǔ)上,生成XML字符串,實現(xiàn)了JSON與XML動態(tài)轉(zhuǎn)換,為開發(fā)者應(yīng)用兩種不同數(shù)據(jù)進(jìn)行開發(fā)提供了一種有效的數(shù)據(jù)轉(zhuǎn)換方式。

猜你喜歡
智慧
有智慧,就是不一樣
金橋(2022年10期)2022-10-11 03:29:32
談“禾”部
智富時代(2019年2期)2019-04-18 07:44:42
智慧退敵
貓的冷酷與智慧
文苑(2018年20期)2018-11-09 01:36:02
致強(qiáng)制勝的智慧
文史春秋(2017年12期)2017-02-26 03:16:10
有智慧的羊
智慧派
智慧決定成敗
主站蜘蛛池模板: 亚洲天堂视频网站| 亚洲av无码人妻| 国产污视频在线观看| 国产SUV精品一区二区6| 久久一本日韩精品中文字幕屁孩| 秘书高跟黑色丝袜国产91在线| 国产精品无码影视久久久久久久| 久久黄色小视频| 久久精品无码一区二区国产区| 久久精品丝袜高跟鞋| 亚洲国产亚综合在线区| 成人在线综合| 亚洲日本精品一区二区| 国产美女视频黄a视频全免费网站| 国产成人精品高清不卡在线| 全午夜免费一级毛片| 久久国产毛片| 伊人网址在线| 91色在线观看| 久久久久久久蜜桃| 亚洲欧洲日韩综合| 亚洲三级片在线看| 国产精品第| 欧美一区福利| 国产成人精品日本亚洲77美色| 色综合日本| 国产小视频网站| 亚洲国产91人成在线| 亚洲欧美精品日韩欧美| 天堂网国产| 久久精品中文字幕少妇| 国产亚洲欧美在线视频| 亚洲国产成人无码AV在线影院L| 伊人成人在线视频| 午夜成人在线视频| 成人在线欧美| 精品中文字幕一区在线| 91无码人妻精品一区| 亚洲 欧美 日韩综合一区| 午夜小视频在线| 久久免费精品琪琪| 国产精品女在线观看| 国产成人综合在线观看| 日日拍夜夜嗷嗷叫国产| 欧美综合一区二区三区| 尤物成AV人片在线观看| 欧美不卡视频在线观看| 国产美女自慰在线观看| 国产精品网址你懂的| 99精品一区二区免费视频| 色AV色 综合网站| 国产三级韩国三级理| 国产精品开放后亚洲| 97视频免费看| 天堂成人av| 国产人碰人摸人爱免费视频| 亚洲精品少妇熟女| 久久人搡人人玩人妻精品| 亚洲国模精品一区| 狠狠色丁香婷婷综合| 国产打屁股免费区网站| 成人福利在线免费观看| 国产成本人片免费a∨短片| 久久亚洲高清国产| 国产在线专区| 国产欧美在线观看精品一区污| 综合网天天| 午夜高清国产拍精品| 麻豆精选在线| 亚洲天堂网站在线| 精品一区二区三区无码视频无码| 国产精品久久自在自线观看| 亚洲无码四虎黄色网站| 亚洲AⅤ综合在线欧美一区| 亚洲第一视频免费在线| 国产AV毛片| 国产成人超碰无码| 色综合中文| 亚洲香蕉久久| 亚洲色无码专线精品观看| 国产欧美日韩另类精彩视频| 国产成人综合网|