摘要:JSON(JavaScript Object Notation)是一种轻量级的数据交换语言。它基于ECMA262语言规范(1999-12第三版)中JavaScript编程语言的一个子集。本文介绍了一个将JSON数据交换语言应用于地震信息在Google Maps上标注的Mashup web服务的实验。本实验表明:对于基于Web2.0的地学信息服务来说,JSON确实是一种较灵活的技术方案。
关键词:JSON; Mashup; Google Maps;地震
中图分类号:P23 文献标识码:A 文章编号:1674-3695-(2009) 05-24-05
1引言
XML拥有跨平台、跨语言的优势,但是,XML的解析比较复杂。无论是服务器端生成或处理XML,还是客户端用JavaScript解析XML,都常常导致复杂的代码,较低的开发效率。实际上,对于大多数Web应用来说,并不需要复杂的XML来传输数据。这就为JSON的Web应用提供了舞台。对那些应用Ajax的Web2.0网站来说,JSON确实是目前最灵活的轻量级方案。例如目前比较流行的Mashup Web服务。
本文介绍了一个实验,将中国地震台网中心公开提供的地震数据编写为JSON格式,结合Google Ajax API加载器,将地震发生地的经纬度坐标数据,标注在Google Map二维地图上,并附加显示出地震的发生时间,震级,当地新闻等信息,给用户以直观的体验。
本实验表明,JSON在基于Web2.0的服务中,充分体现了其易于编码、易于解析、传输高效的特点,提高了Web2.O的部署效率,在地学信息服务领域有较大的应用前景。
2JSON概述
与XML一样,JSON也是一种基于纯文本的数据格式。JSON的数据格式非常简单,可以用JSON传输一个简单的String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object对象。
通过将JSON与XML的特性相比较(如下),可以发现JSON简化数据编码与访问,从而提高了数据传输效率的优点。
(l)可读性,JSON和XML的可读性不相上下,JSON是建议的语法,XML是规范的标签形式;
(2)可扩展性,XML有很好的扩展性,JSON也具有相同的特性;
(3)编码难度,XML的发展和应用的时间较久,形成了丰富的编码工具,这点JSON比较欠缺。但是JSON的编码本身比较容易,即使不借助工具也能写出JSON的代码;
(4)解码难度,XML的解析得考虑子节点父节点,而JSON的解析难度几乎为0;
(5)命名空间,XML允许不同上下文中的相同的信息段彼此混合,然而,在JSON中已经找不到了命名空间;
(6)数据验证,XML的语法及其内容属性,可以通过配套的DTD文件或者XSD文件来验证,JSON显然还缺少一定的规范约束。
3Mashup相关技术
3.1Mashup概述
Mashup是将多个不同的支持Web API的应用进行堆叠而形成的新型Web服务。它利用了从多个外部数据源检索到的内容来创建全新的、综合的服务,将来自不止一个数据源的内容进行组合,创造出更加增值的、更加满足用户需求的服务。Mashup所能利用的外部数据源格式多种多样,表现出惊人的兼容性,它涵盖public APIs, XML/RSS/Atom feeds, Web services, HTML等。充分体现了Web2.0时代,协作和共享的思想精髓。
3.2 Mashup的应用类型
Mashup主要分为下面四种类型。
(l)地图Mashup
目前,人们搜集的大量有关事物和行为的数据,大部分具有位置注释信息。所有这些包含位置信息的数据集,可以利用地图,通过图形化方式呈现出来。自从Google公开了自己的Google Maps API,让Web开发人员可以方便的在地图中随意标注所有类型的数据。这种直观简洁的体验,极大的促进的Mashup的发展。而本文所应用的Mashup服务就属于地图应用类型。
(2)视频和图像Mashup
Mashup的设计者可以将这些视频和图像的内容和其他与内容相关的信息(例如谁拍的照片,照片的内容是什么,在何时何地拍摄的等等)放到一起。
(3)搜索和购物Mashup
开发设计人员使用B2B技术或屏幕抓取的方式来收集、比较多个数据源公布的价格数据,方便用户进行选择,进而指导人们消费。
(4)新闻Mashup
新闻Mashup可以根据一名用户的定制,将多个新闻源的新闻提要聚集起来。并将其通过Web呈现出来,创建个性化的报纸,从而满足读者独特的兴趣。
3.3 Mashup应用架构
Mashup应用从架构上是由三个不同的部分组成的,它们在逻辑上和物理上都是相互脱离的(可能由网络和组织边界分隔):服务提供者(包括API接口和数据源)、Mashup站点和客户机的Web浏览器。如图1所示。
(1)API接口或者数据源。它们一般是彼此独立的内容或者接口的提供者。为了方便数据的检索,提供者通常会将自己的内容通过Web协议对外提供。然而,也有很多有价值的潜在数据源并没
有方便地对外提供API。但是,开发者也可以通过屏幕抓取的技术来实现数据获取。
(2)Mashup站点。即Mashup逻辑所在的地方,而并不一定是执行这些逻辑的地方。Mashup可以根据需求,聚积多个服务器提供的动态内容,通过传统的Web应用程序发布服务。
(3)客户机的Web浏览器。这是以图形化的方式呈现应用程序的地方,也是用户交互发生的地方。Mashup通常都使用客户机端的逻辑来构建合成内容。
4 Mashup的实现
4.1系统体系结构
本文实现的Mashup服务通过Google Map标注出1999年至2008年,发生在中国以及和中国相邻地区的震级大于等于7级的事发点,显示当地地震发生的时间、震级等相关信息。系统的数据来源分两部分,地震数据和地图数据。地震数据是根据中国地震台网中心网站(http://www.csndmc.ac.cn/newweb/data.htm,日期1999-l-l至2008-12-31,东经135度至东经73度,北纬3度至北纬53度,深度O至800,震级7至10)提供的在线数据信息,编写为JSON数据格式。地图数据来自Google Map API服务。
系统的架构如下图2所示,来自客户机浏览器的请求转向Mashup站点所在的服务器。请求的页面包括HTML和JavaScript。JavaScript调用地震数据和Google Map API加载的地图数据服务后,按照地震发生地的经纬度坐标进行内容组合。
4.2关键技术实现
系统关键技术主要包括三个部分,利用Google Ajax API加载器加载Google Map,创建JSON格式的地震数据文件,以及读取地震服务数据文件。
(1)利用Google Ajax API加载器加载Google Map
对Google地图API中当前使用的所有类、方法和属性使用google.maps.*名称控件,使用此名称空间替换G前缀。使用google.setOnLoadCallback()对对象执行初始化。例如,当使用Google Ajax API加载器时,GMap2对象映射到google.maps.Map2。
<script type="tex/javascript">
function load(){
if(GBrowserIsCompatible()){
var map=new GMap2(document.getElement-Byld("google_map_div"));
map.addControl(new GSmallMapControl());
map.addControl(new GScaleControl());
map.setCenter(new GLatLng(36.5,108),3);
}
}
(2)创建JSON格式的地震数据文件
本实验所应用的JSON数据结构是Object对象。Object对象在JSON中是用{}包含一系列无序的Key-Value键值对表示的,Key-Value之间使用“:”(冒号)分隔,Key-Value键值对之间使用“,"(逗号)分隔。
数组是值(value)的有序集合。一个数组以“【”(左中括号)开始,“】”(右中括号)结束。值之间使用“,"(逗号)分隔。此处的Object相当于Java中的Map,而不是Java的Class。另外,Key只能用String表示。其中Value也可以是另一个Object或者数组,因此,复杂的Object可以嵌套表示。
本实验中,一个locations对象包含多个location对象,而location又包含了id、city、date等对象,具体表,如下:
{"locations":
{"location":[
{"id":"四川汶川县",
"city":"四川汶川县",
"date":"2008-05-12",
"time":"14:28:04.0",
"level":"Ms8.O",
"address":"31.0,103.4",
"information":"地震已致65080人遇难
360058人受伤23150人失踪(数据更新中)"
},……
]
}
}
将上面的JSON数据结构使用XML改写,如下:
<locations>
<location>
<id>
<city>
<date>
<time>14:28:04.0</time>
<address>31.0,103.4</address>
<information>地震已致65080人遇难360058人受伤23150人失踪(数据更新中)</information>
……
</locations>
目前,主流技术都提供了对json数据的解析以及与其它相关数据格式的方便转化。java提供了JSON-lib开发包可以用于把bean,map和XML转换成JSON,并能够把JSON转回成bean和DynaBean。而微软的AJAX也提供了对JSON的支持,使用的是Sys-tem.Runtime.Serialization.Json的内容。
(3)读取JSON地震数据文件
要在地图上把地震信息标注出来,需要在JavaScript脚本中解析出JSON数据文件中的地震信息,包括地震发生的时间、城市、经度、纬度以及震级等。
// read file
receiveReq.open("post",’earth∵.data’,true);
……
// initialization
var response=eval(" ("+receiveReq.responseText+")");
……
// get city,id,date,time,and level information about earth∵
for(vari=0;i var city=response.locations.location[i].city;
……
var id=response.locations.location[i].id;
var information=response.locations.location[i].information;
var addr=response.locations.location[i].address;
……
4.3服务应用界面
用户需要打开浏览器,访问网络上的本Mashup站点,尽管地震数据是以JSON的格式保存在Mashup站点,但是Google Maps需要API进行在线数据调用。用户可以对地图进行简单的放大,缩小,拖拽的操作。
初始的地图界面会直接定位在中国以及和中国相邻地区,用户点击右边的数据列表,地图上会在正确的经纬度坐标上进行标注。并同时显示当地地震发生的
时间、震级等相关信息,操作如图4-2所示。
5结束语
JSON以其轻巧的传输,简单的编码、解析等优势,在Ajax,Mashup等web2.0应用上都体现了它的价值。JSON已经是JavaScript标准的一部分。目前,主流的浏览器对JSON支持都非常完善。掌握JSON数据交换语言,无疑会在我们进行Web开发时,多一种轻量级的数据解决方案。本文只介绍了JSON在数据编码和解析的应用,进一步的网络传输性能,数据验证,Ajax应用等特性,值得我们进行进一步的研究。
参考文献:
[1] JSON在Wikipedia(维基百科)中的定义http:// zh.wikipedia.org/w/index,php?
title=JSON&variant=zh-cn
[2]Mashup(Web application hybrid).http://en.wikipedia.org/wiki/
Mashup_(Web application hybrid)
[3]Google Maps一种由Google提供的基于网络的地图服务和技术
http://en.wikipedia.org/wiki/Google_Map
[4]XML可扩展标记语言http://www.w3.org/XML/
[5]中国地震台网中心地震数据管理和服.http://www.csndmc.ac.cn/
[6]JSON一lib下载地址:http://json-lib.sourceforge.net/ [7]system.Runtime,Serialization命名空间包含
一些类,这些类可用于将对象序列化为JavaScript对象表示法(JS0N),并可用于从JSON反序列化对象。
[8]使用Coogle AJAX API加载器.http://code.google.com/intl/zh-
CN/APIs/maps/documentation/index.html
[9] Web2.0 http://en.wikipedia.org/wiki/Web_2.0
[10]JSON官方网站 http://www.json.org
[11]Programmable Web. http://www. ProgrammableWeb.corn/
[12]IBM DeveloperWorks中国网站 http://www.ibm.com/developer- works/cn/