APP下载

JSON与XML动态转换研究及应用

2018-11-19赵建军张锦鹏

软件导刊 2018年11期
关键词:键值字符串文件夹

刘 立,赵建军,张锦鹏,余 进

(昆明理工大学 理学院,云南 昆明 650500)

0 引言

智慧城市是以互联网、物联网、电信网、广电网、无线宽带网等网络组合为基础,以智慧技术高度集成、智慧产业高端化发展、智慧服务高效便民为主要特征的城市发展新模式。智慧城市核心是运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息[1]。

感知层是智慧城市体系对现实世界进行感知、识别和信息采集的基础性物理网络,海量的数据在感知层产生[2]。由于智慧城市的飞速发展,基于物联网的应用愈加丰富,客户端和服务器端数据交换方式也越来越多[3]。在相关AJAX[4](Asynchronous Java Script and XML)应用中,XML和JSON是主要数据交换格式。为了更好实现数据交换,选择合适的数据转换格式对实现数据转换、保障应用程序性能至关重要[5]。JSON具有规则简单、便于学习的特点,且配有多种语言开发包,在项目中易于使用。无论是使用JavaScript还是其它编程语言,操作JSON的代码量都相对较少。由于占用空间小、处理速度快,使JSON在AJAX应用中优势明显,在Web服务与数据存储方面有很大的发展空间。XML更常见于企业应用。严格的规范与众多周边技术使XML 应用范围易于扩展,同时大量商业化应用程序支持XML,使非IT人员可以较为容易地编写、阅读XML。有些传感器获取的文件是以JSON格式存储于服务器,为了将传感器获取的数据进行实时可视化,需要将JSON格式文件实时、动态地转换为XML格式文件,以便Web端解析调用,最终实现在前端页面实时展示。本设计通过实现动态JSON转XML并自定义转换JSON文件内容,实现感知层获取数据的有效利用。

1 JSON与XML

1.1 JSON

JSON[6](JavaScript Object Notation)是一种轻量级数据交换格式,可在多种语言之间进行数据交换,易于读写和机器解析、生成。 作为基于JavaScript Programming Language(Standard ECM A - 262 3rd Edition - December 1999)的一个子集,JSON采用完全独立于语言的文本格式,但因具有类似于C语言家族的特点(C、C++、C#、JAVA、JavaScript、Perl、Python等),使JSON成为理想的数据交换语言[7]。

JSON规则简单,使用压缩格式,占用带宽小,多用于服务器中,JSON字符串由带双引号的Unicode字符集合组成,字符数量不受限制,单个字符也是一个字符串,其中JSON对象是一个无序的“名称/值”集合,每个“名称/值”之间使用逗号“,”分隔。每个名称使用双引号“”””括起来,“名称”后跟着一个冒号“:”,冒号后是值[8-10]。本设计中用于转换的JSON文本数据如下所示:

{"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

可扩展标识语言[11](Extensible Markup Language, XML)源自标准通用标记语言SGML,1995年发展出雏形,并向W3C提案,于1998年2月发布为W3C标准(XML1.0)。XML是Internet环境中依赖内容的跨平台技术,能高效处理现今的结构化文档信息[12-13]。作为一种允许用户对标记语言进行定义的源语言,XML既可以用于标记数据也可定义数据类型,目前已在电子商务、无线通信、数字图书馆、多媒体数据库和资料库等领域广泛应用[14]。XML使用元素和属性描述数据。在数据传送过程中,XML 始终保留了诸如父/子关系等数据结构。多个应用程序可以共享和解析同一个XML文件,不必使用传统字符串解析或拆解。相反,普通文件不描述每个数据段(除头文件中外),也不保留数据关系结构。使用XML进行数据交换可以使应用程序更有弹性,因为可以用位置(与普通文件一样) 或元素名(从数据库)存取XML数据。Web服务让使用不同操作系统和不同编程语言的人们能够互相交流和分享数据,其前提是各Web服务器使用XML文件在各系统之间交换数据。

XML不提供数据的显示方法,只用节点和属性描述数据,因此XML提供了一个标记独立于平台和语言内容的有效方法[15]。使用XSLT[16]语言能轻易地将XML文件转换成各种格式文件,XML能够运行于不同系统平台之间和转换成不同格式目标文件的能力使其成为内容管理应用系统中的重要格式,其中XML文件中每个文档必须有开始和结束标签。JSON文件转换为XML文件的显示形式如下所示:

04FFC0900000000B

123254321111111155555555555500000000000000000000

C0900000000B69D8EA

010000000059C5

1.3 JSON与XML分析

JSON和XML都是开放式数据交换,二者既有可通用的方面,也有不同之处。相对于JSON而言,XML属于重量级数据格式[17]。二者都具有与编程语言无关性的特点,目前常用于异构应用程序之间数据传递。具体相关特性比较如表1所示[18]。

表1 JSON与XML特性比较

针对JSON和XML的优缺点,根据不同情况采用对应的文件格式描述数据。智慧城市中感知层获取的数据可以利用占用内存小的JSON文件保存,而实现数据可视化需要利用XML文件进行解析,由于XML利用标记语言的特性实现了良好的延展性,在数据存储、扩展以及高级检索方面具备JSON无法比拟的优势[19]。因此,实现实时展现传感器获取数据需要实时动态地将JSON文件转换为XML文件,以便Web前端解析,从而实现在前端页面显示。

2 JSON与XML动态转换实现

为实现模块化、结构化设计,使系统各部分保持相对独立,最大程度降低耦合,提高系统扩展性和灵活性[20],首先通过服务器读取待处理的JSON文件,然后对其进行序列化转换,生成JSON字符串;再将JSON字符串转换为MAP键值对,对其中的内容进行修改、删除,即实现自定义数据;最后将转换后的JSON文件转为XML文件,保存到指定位置以便Web前端解析使用。为了实现动态化整个设计采用JAVA线程处理,即每隔3秒进行刷新,扫描文件夹是否存有JSON文件,如果有则继续进行转换。图1为实现模块化设计的流程结构。

图1 模块设计流程

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;

}

本代码段可以实现从一个指定的文件夹读取JSON格式的文本文件,从而确定JSON文件动态转XML文件的数据来源。本方法也可扩展应用到从文件夹中获取其它格式的文件。

2.2 JSON文件向Map转换

将JSON文件转换为Map,主要用于修改和删除JSON文件,实现转换的可裁剪性,最终获取转换后的JSON文件内容,操作主要包含两部分:

(1)修改。

monitorId: HQSJ2LINE(YNZZ

lastSeenTime: 1494852437122(2017-05-15 20:47:45,即对获取的时间字符串进行时间格式化转换。

(2)删除。删除不需要转换的JSON信息,例如:firstSeenTime、eventId、antennaNo、readerId,即删除原有冗余数据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转换

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

JSONObject jsonnew = JSONObject.fromObject (value);

本段代码是从Map转换后再转为自定义后的JSON字符串,即经过删减和修改后的字符串。

2.4 JSON向XML转换

publicstatic String jsonToXML(JSONObject json) {

JSONObject jobj = JSONObject.fromObject(json);

String xml = SERIALIZER.write(jobj);

return xml; }

本段代码实现了将JSON字符串转换为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(); }

本段代码主要实现将转换后的XML文件存储到对应的文件夹中,以满足Web调用。本方法也可实现将字符串保存为其它格式,只需要在保存路径中添加要保存的后缀即可实现。

2.6 JSON与XML文件动态转换

采用单线程实现JSON与XML文件的动态转换,即从本地文件夹读取JSON文件,再转换为XML文件,然后将获取的XML文件存储到本地,在运行过程中动态删除已经转换的JSON文件,利用线程定时扫描文件夹,如果扫描到新的JSON文件,则重复以上操作,进行实时转换。

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函数中的实现

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

while(true){

Thread t1 = new Json2Xml();

t1.start();

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace(); } } }

本段代码主要启动线程,进行JSON与XML动态转换,其中采用while(true)循环实现程序可以保持一直运行状态,从而使得JSON动态转换为XML。在实际运用中,将以上实现过程打成jar包,用户只需启动jar包即可从某一指定位置读取JSON文件,然后经过jar包转换成XML文件后存储到另一指定位置。

3 结语

本文基于智慧城市发展中感知层的应用,对感知层多传感器源数据处理的不同数据交换格式进行了研究。通过序列化JSON字符串,深入分析MAP键值对,剔除冗余键值对,从而将修改后的MAP键值对再转为自定义后的JSON字符串,然后在重新自定义JSON字符串的基础上,生成XML字符串,实现了JSON与XML动态转换,为开发者应用两种不同数据进行开发提供了一种有效的数据转换方式。

猜你喜欢

键值字符串文件夹
挂在墙上的文件夹
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案
注册表值被删除导致文件夹选项成空白
“扫除”技巧之清除恶意程序