- 浏览: 297944 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
colin_i:
总结的很好,谢谢
Spring事务传播机制和数据库隔离级别 -
xiaoxi0324:
我想问,是否支持获取method内的逻辑分支,比如if分支,普 ...
javassist 学习笔记 -
z390174504:
不错,不错哦
web.xml 中的listener、 filter、servlet 加载顺序及其详解 -
chokee:
...
web.xml 中的listener、 filter、servlet 加载顺序及其详解 -
chenchangqun:
细致啊,楼主辛苦。
web.xml 中的listener、 filter、servlet 加载顺序及其详解
结构
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object) ,纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value
)可以是双引号括起来的字符串(string
)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string )是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string )与C或者Java的字符串非常相似。
数值(number )也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
空白可以加入到任何符号之间。 以下描述了完整的语言。
发展及简介
XML——这种用于表示客户端与服务器间数据交换有效负载的格式,几乎已经成了Web
services的同义词。然而,由于Ajax和REST技术的出现影响了应用程序架构,这迫使人们开始寻求`XML的替代品,如:JavaScript
Object Notation(JSON
)。
JSON
作为一种更轻、更友好的 Web services客户端的格式(多采用浏览器的形式或访问 REST风格 Web服务的Ajax应用程序的形式)引起了 Web 服务供应商的注意。
本文将阐述JSON
在Web services设计中备受推崇的原因,以及它作为XML替代方案的主要优势和局限性。文中还会深入探讨:随着相应的Web 服务客户端选择使用JSON
,如何才能便捷地在Java Web services中生成JSON
输出。
XML的十字路口: 浏览器和 Ajax
XML设计原理已经发布了将近十年。时至今日,这种标记语言已经在广阔的软件应用领域中占据了主导地位。从Java、.NET等主流平台中的
配置和部署描述符到应用集成场景中更复杂的应用,XML与生俱来的语言无关性使之在软件架构师心目中占据着独特的地位。但即便最著名的XML权威也不得不
承认:在某些环境中,XML的使用已经超出了它自身能力的极限。
围绕Ajax原理构建的那些Web应用程序最能说明XML的生存能力,从这一点来看,一种新的有效负载格式的发展壮大也得益于XML。这种新的有效负载格式就是JavaScript Object Notation (JSON
)。在探索这种新的标记语言的复杂性之前,首先来分析一下在这种独特的设计形式中,XML具有哪些局限性。
Ajax建立了一个用于从远程Web
services发送和接收数据的独立信道,从而允许Web程序执行信道外(out-of-band)客户端/服务器调用。通俗地说,Ajax程序中的更
新和导航序列在典型的客户端/服务器环境之外完成,在后台(即信道外)接受到信息后,必须进行一次完整的屏幕刷新。更多背景信息,请参阅David
Teare的 Ajax简介(Dev2Dev)。
这些应用程序更新通常是通过REST风格(RESTful)Web
services获得的,一旦被用户的浏览器接收到,就需要整合到HTML页面的总体布局之中,这正是XML发挥强大力量的场合。尽管近年来,脚本语言支
持和插件支持已使大多数主流浏览器的功能得到了强化,但许多编程任务依然难于开展,其中之一就是操纵或处理文本,这通常是使用DOM实现的。
采用DOM的复杂性源于其基于函数的根,这使得对数据树的简单修改或访问都需要进行无数次方法调用。此外,众所周知,DOM在各种浏览器中的
实现细节不尽相同,这一过程将带来极为复杂的编程模式,其跨浏览器兼容性出现问题的可能性极大。接下来的问题显而易见,那就是:如何使一种标记语言轻松集
成到HTML页面中以满足Ajax的要求?
问题的答案就是:利用所有主流浏览器中的一种通用组件——JavaScript引擎。XML需要使用DOM之类的机制来访问数据并将数据整合
到布局之中,采用这种方法,我们不再使用像XML这样的格式来交付Ajax更新,而是采用一种更为简单直观的方式,采用JavaScript引擎自然匹配
的格式——也就是JSON
。
既然已经明确了JSON
与XML和Ajax之间的关系,下面将进一步探讨JSON
背后的技术细节。
JSON
剖析:优点和不足
对于JSON
,首先要明白JSON
和XML一样也是一种简单文本格式。相对于XML,它更加易读、更便于肉眼检查。在语法的层面上,JSON
与其他格式的区别是在于分隔数据的字符,JSON
中的分隔符限于单引号、小括号、中括号、大括号、冒号和逗号。下图是一个JSON
有效负载:
{"addressbook": {"name": "Mary Lebow",
"address": {
"street": "5 Main Street"
"city": "San Diego, CA",
"zip": 91912,
},
"phoneNumbers": [
"619 332-3452",
"664 223-4667"
]
}
}
将上面的JSON
有效负载用XML改写,如下:
<addressbook>
<name>Mary Lebow</name>
<address>
<street>5 Main Street</street>
<city zip="91912"> San Diego, CA </city>
<phoneNumbers>
<phone>619 332-3452</phone>
<phone>664 223-4667</phone>
</phoneNumbers>
</address>
</addressbook>
是不是很相似?但它们并不相同。下面将详细阐述采用JSON
句法的优点和不足。
优点
乍看上去,使用JSON
的数据分隔符的优点可能并不那么明显,但存在一个根本性的缘由:它们简化了数据访问。使用这些数据分隔符时, JavaScript引擎对数据结构(如字符串、数组、对象)的内部表示恰好与这些符号相同。
这将开创一条比DOM技术更为便捷的数据访问途径。下面列举几个JavaScript代码片段来说明这一过程,这些代码片段会访问先前的JSON
代码片段中的信息:
访问JSON
中的名称: addressbook.name
访问JSON
中的地址: addressbook.address.street
访问JSON
中的电话号码第一位:addressbook.address.phoneNumbers[0]
如果您具备DOM编程经验,就能很快地看出区别;新手可以参看 Document Object Model 的这一外部资源,这里提供了关于数据导航的实例。
JSON
的另一个优点是它的非冗长性。在XML中,打开和关闭标记是必需的,这样才能满足标记的依从性;而在JSON
中,所有这些要求只需通过一个简单的括号即可满足。在包含有数以百计字段的数据交换中,传统的XML标记将会延长数据交换时间。目前还没有正式的研究表明JSON
比XML有更高的线上传输效率;人们只是通过简单的字节数比较发现,对于等效的JSON
和XML有效负载,前者总是小于后者。至于它们之间的差距有多大,特别是在新的XML压缩格式下它们的差距有多大,有待进一步的研究。
此外,JSON
受到了擅长不同编程语言的开发人员的青睐。这是因为无论在Haskell中或 Lisp中,还是在更为主流的C#和PHP中,开发都可以方便地生成JSON
(详见 参考资料)。
不足
和许多好东西都具有两面性一样,JSON
的非冗长性也不例外,为此JSON
丢失了XML具有的一些特性。命名空间允许不同上下文中的相同的信息段彼此混合,然而,显然在JSON
中已经找不到了命名空间。JSON
与XML的另一个差别是属性的差异,由于JSON
采用冒号赋值,这将导致当XML转化为JSON
时,在标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作文本考虑。
另外,JSON
片段的创建和验证过程比一般的XML稍显复杂。从这一点来看,XML在开发工具方面领先于JSON
。尽管如此,为了消除您对这一领域可能存在的困惑,下节将介绍一些最为成熟的JSON
开发。
从Web services生成JSON
输出
既然JSON
的首要目标是来自浏览器的信道外请求,那么我们选择REST风格(RESTful)Web服务来生成这些数据。除了用典型业务逻辑探究Web服务之外,还将采用特定的API把本地Java结构转化为JSON
格式(详见 参考资料)。首先,下面的Java代码用来操纵Address对象:
// Create addressbook data structure
SortedMap addressBook = new TreeMap();
// Create new address entries and place in Map
// (See download for Address POJO structure)
Address maryLebow = new Address("5 Main Street","San Diego, CA",91912,"619-332-3452","664-223-4667");
addressBook.put("Mary Lebow",maryLebow);
Address amySmith = new Address("25 H Street","Los Angeles, CA",95212,"660-332-3452","541-223-4667");
addressBook.put("Sally May",amySmith);
Address johnKim = new Address("2343 Sugarland Drive","Houston, TX",55212,"554-332-3412","461-223-4667");
addressBook.put("John Kim",johnKim);
Address richardThorn = new Address("14 68th Street","New York, NY",,12452,"212-132-6182","161-923-4001");
addressBook.put("Richard Thorn",richardThorn);
该Java结构在哪里生成并不重要(可能是在JSP、Servlet、EJB或POJO中生成),重要的是,在REST风格Web 服务中有权使用这些数据。如下示:
// Define placeholder for JSON
response
String result = new String();
// Get parameter (if any) passed into application
String from = request.getParameter("from");
String to = request.getParameter("to");
try {
// Check for parameters, if passed filter address book
if(from != null && to != null) {
// Filter address book by initial
addressBook = addressBook.subMap(from,to);
}
// Prepare the convert addressBook Map to JSON
array
// Array used to place numerous address entries
JSONArray jsonAddressBook = new JSONArray();
// Iterate over filtered addressBook entries
for (Iterator iter = addressBook.entrySet().iterator(); iter.hasNext();) {
// Get entry for current iteration
Map.Entry entry = (Map.Entry)iter.next();
String key = (String)entry.getKey();
Address addressValue = (Address)entry.getValue();
// Place entry with key value assigned to "name"
JSONObject jsonResult = new JSONObject();
jsonResult.put("name",key);
// Get and create address structure corresponding to each key
// appending address entry in JSON
format to result
String streetText = addressValue.getStreet();
String cityText = addressValue.getCity();
int zipText = addressValue.getZip();
JSONObject jsonAddress = new JSONObject();
jsonAddress.append("street",streetText);
jsonAddress.append("city",cityText);
jsonAddress.append("zip",zipText);
jsonResult.put("address",jsonAddress);
// Get and create telephone structure corresponding to each key
// appending telephone entries in JSON
format to result
String telText = addressValue.getTel();
String telTwoText = addressValue.getTelTwo();
JSONArray jsonTelephones = new JSONArray();
jsonTelephones.put(telText);
jsonTelephones.put(telTwoText);
jsonResult.put("phoneNumbers",jsonTelephones);
// Place JSON
address entry in global jsonAddressBook
jsonAddressBook.put(jsonResult);
} // end loop over address book
// Assign JSON
address book to result String
result = new JSONObject().put("addressbook",jsonAddressBook).toString();
} catch (Exception e) {
// Error occurred
}
为了便于说明,我们已将这段代码将置入JSP(restservice.jsp)中。如果它真是一段程序,那么类似这样的代码也会出现在
servlet或helper类中。
REST风格Web服务首先提取两个通过URL请求传递给它的输入参数,根据这些值过滤现有的地址簿以适应请求。过滤过地址簿后,即可开始循环检查
Java映射中的每个条目。
您会注意到,在循环内部,json
.org API被广泛用于将本地Java格式转化为JSON
字符串。虽然仅使用了少量类(即JSONArray和JSONObject),但API提供的转换方法相当广泛,甚至能将XML结构转换成JSON
输出。但回到我们的Web服务,一旦循环遍历了所有条目,那么变量“result”会包含准备返回给请求方的地址簿的JSON
同等部分。
既然已经生成了JSON
输出,下面来看看等式的另一边:浏览器应用程序中JSON
有效负载的使用。
JSON
有效负载的使用
作为基于浏览器的客户端,我们的设计中大部分工作都是在HTML、JavaScript加上附加的JavaScript
框架下完成的。例如利用Prototype库轻松创建跨浏览器样式的Ajax调用。下面的清单包含了我们的应用程序的第一部分,以及相应的
JavaScript函数。
<html>
<head>
<title> JSON
Address Book </title>
<script type="text/javascript" src="prototype-1.4.0.js"></script>
<script type="text/javascript">
// Method invoked when user changes letter range
function searchAddressBook() {
// Select values from HTML select lists
var fromLetter = $F('fromLetter');
var toLetter = = $F('toLetter');
// Prepare parameters to send into REST web service
var pars = 'from=' + fromLetter + '&to=' + toLetter;
// Define REST web service URL
var url = 'restservice.jsp';
// Make web service Ajax request via prototype helper,
// upon response, call showResponse method
new Ajax.Request( url, { method: 'get', parameters: pars,
onComplete: showResponse });
}
</script>
</head>
首先导入了prototype库,该库用于促进对REST风格Web服务的Ajax调用。接下来是searchAddressBook()函
数,当用户修改其下所示的HTML选择列表时,将会触发此函数。该函数被触发后,用户将会获得HTML选择列表中已选中的选项,并将其放入两个用于过滤地
址簿的变量中,随后定义一个指向REST风格服务URL restservice.jsp的附加变量。
此方法中还包括借助原型函数new Ajax.Request( url, { method: 'get', parameters:
pars, onComplete: showResponse }); 的实际Ajax
Web服务调用;表明了对相关URL的一个请求,其请求参数包含在pars中;最后一旦Ajax请求终止,即执行showResponse()。
下面以showResponse()为例说明用于评估JSON
有效负载并将其放入HTML主体布局环境中的的必要代码。
// Method invoked when page receives Ajax response from REST web service
function showResponse(originalRequest) {
// Get JSON
values
jsonRaw = originalRequest.responseText;
// Eval JSON
response into variable
jsonContent = eval("(" + jsonRaw + ")");
// Create place holder for final response
finalResponse = "<b>" + jsonContent.addressbook.length +
" matches found in range</b><br/>";
// Loop over address book length.
for (i = 0; i < jsonContent.addressbook.length; i++) {
finalResponse += "<hr/>";
finalResponse += "<i>Name:</i> " + jsonContent.addressbook[i].name + "<br/>";
finalResponse += "<i>Address:</i> " + jsonContent.addressbook[i].address.street + " -- " +
jsonContent.addressbook[i].address.city + "," +
jsonContent.addressbook[i].address.zip + ".<br/>";
finalResponse += "<i>Telephone numbers:</i> " + jsonContent.addressbook[i].phoneNumbers[0] + " & " +
jsonContent.addressbook[i].phoneNumbers[1] + ".";
}
// Place formatted finalResponse in div element
document.getElementById("addressBookResults").innerHTML = finalResponse;
}
此方法的输入参数是REST风格Web服务在调用时返回的响应。既然预先已经知道需要处理JSON
字符串,那么可以利用JavaScript eval()函数,将这个JSON
字符串放入内存,并允许数据访问,正是这样的简便性促使开发人员使用JSON
。完全不需要进行解析,一个简单的eval()即可得到JavaScript结构,我们可以像操纵其他任何JavaScript结构一样地去操纵它。
一旦JSON
响应经过eval处理,将创建一个JavaScript循环来提取
每个地址条目,并将各个匹配项放入一个名为finalResponse的容器变量中。而这个容器变量本身包含所有必要的格式,用于在页面布局中显示最终地
址簿。循环结束时,匹配项也通过document.getElementById("addressBookResults").innerHTML放置
完毕。
最后,为了保持完整,页面的实际布局由这些代码组成:
<body>
<h4 style="text-align:left">Request address book matches:</h4>
<table style="text-align:left" cellpadding="15"><tr><td valign="top">From:<br/>
<select id="fromLetter" size="15" onchange="searchAddressBook()">
<option>A</option>
...
<option>Z</option>
</select>
</td><td valign="top">To:<br/>
<select id="toLetter" size="15" onchange="searchAddressBook()">
<option>A</option>
...
<option>Z</option>
</select>
</td><td valign="top">
<h5> Results </h5>
<div style="text-align:left" id="addressBookResults">Please select range</div>
</td></tr>
</table>
</body>
上面的代码清单中最值得一提的是HTML选择列表,因为修改触发器Java程序需要调用信道外Ajax请求。其次,<div>元素就是放置格式化后的JSON
响应的地方。
JSON
适合您吗
就像在软件设计中编程语言的选择一样,JSON
的选择与否取决于您自身的需求。如果Web services使用者将在传统、功能完备的编程环境(如Java 、.NET、PHP、Ruby等)中创建,那么完全可以不使用JSON
。给定大多数编程语言环境的无限制能力可提供完整的配置控制权(更不必说对定制库、分析器或helper类的访问),那么JSON
与XML及其他Web services有效载荷之间的差别可以忽略不计。
反之,如果Web services使用者被限制在浏览器环境之外,那么JSON
是值得认真考虑的对象。 在浏览器中使用Web services并非兴趣使然,而是实际业务需求。如果这时需要一个加载数据时不会出现延迟/刷新的“漂亮的Web 2.0界面”, 就不得不在浏览器中嵌入Ajax和Web services技术。
在这种情况下,您不仅受限于通过网络访问处理环境,而且还会受到随机用户的限制,迫使经验丰富的开发人员用最普遍的工具在浏览器中处理文本,例如:前述的DOM,与访问JSON
树相比,DOM使用起来非常困难。
示例代码
您可下载与本文相关的代码。
json_addressbook.zip ——示例代码和实用工具
安装之前先解压下载得到的文件,将addressbook.html,prototype-1.4.0.js和restservice.jsp放入任意程序的目录下。将内含的json
.jar复制到所选程序的/WEB-INF/lib目录下。访问<yourhost>/<yourappdir>/addressbook.html,并在HTML列表中进行选择。一切就绪,可以运行JSON
了!
结束语
尽管 “Ajax”中的“x”代表XML,Web services也通过坚持使用XML格式而成为主流,但这并不意味着这种方式无懈可击。在文本处理方面,XML在Ajax程序的应用中已经暴露出一些缺点。在这种情形下,JSON
逐渐成为引人注目的XML替代方案。
通过对JSON
语法优缺点的论述,以及对如何从REST风格Web services创建JSON
输出、如何将其嵌入Web页面布局等问题的介绍,您现在应该能够为最终用户提供支持JSON
的Web services,接触当前提供的大量利用这一极具前途的格式的Web services。
发表评论
-
DWR 学习笔记
2009-05-07 16:02 1597下面是从一个实例的构建过程进行分析。 1、DWR 介绍 ... -
struts2+json+jquery 二级联动 例子
2009-04-12 22:25 6340struts2.1.X 版本中已经把ajax 主题移到了do ... -
JSON与JAVA的数据转换
2008-12-29 21:19 2588JSON-lib这个Java类包用于把bean,map和XML ... -
ajax学习笔记(二)--jquery的应用
2008-12-28 21:22 19991、以文本方式传输 //定义用户名校验的方法 func ... -
ajax学习笔记(一) --实现原理
2008-12-28 20:57 17431、用文本方式获得: ajax servlet端代码和 ...
相关推荐
在这个"json学习资料"的压缩包中,我们可能会找到与Java开发相关的JSON处理示例和代码。 在Java中,处理JSON的主要库有Jackson、Gson和org.json等。这些库提供了方便的方法来解析JSON字符串,将其转换为Java对象,...
在"json 实现ajax 返回对象 操作 json 学习 json研究"这个主题中,我们将深入探讨以下几个关键知识点: 1. **JSON格式基础**:JSON是一种文本格式,它由键值对组成,以大括号{}包围。键是字符串,用双引号包围,...
### JSON学习笔记:深入理解与应用 #### 一、JSON简介与重要性 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于ECMAScript的一个子集,采用...
解析和生成JSON是JSON学习中的关键技能。在JavaScript中,你可以使用`JSON.parse()`函数将JSON字符串转换为JavaScript对象,而`JSON.stringify()`函数则用于将JavaScript对象转换为JSON字符串。其他编程语言如Python...
### WCF返回JSON学习笔记 #### 一、WCF与JSON简介 - **WCF (Windows Communication Foundation)**:是微软开发的一个框架,用于构建服务导向的应用程序。它提供了多种通信协议的支持,包括HTTP、TCP等,并且支持...
在本文档《json 学习笔记_***.pdf》中,主要介绍了在Java开发中,如何使用三个常用的JSON处理工具:struts json,json_lib,jackson-mapper。同时,也提到了在使用这些工具时可能遇到的一些常见错误及其处理方法。 ...
在本文中,我们将深入探讨“Spring MVC JSON学习”这一主题,重点关注如何在Spring MVC应用中处理JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁性和易读性而被广泛应用。 ...
四轧json学习学习111111
在这个“json学习笔记、jackson的jar包”中,我们可以深入探讨JSON和Jackson的相关知识点。 1. JSON基本概念: - JSON是一种文本格式,易于人阅读和编写,同时也易于机器解析和生成。 - JSON数据结构主要由对象...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它是基于JavaScript的一个子集,主要由对象、数组、字符串、数字、布尔值和null这些数据类型组成。 ...
个人关于设备的json学习
JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,因其简洁、易读、易解析的特性,被广泛应用于各种编程语言间的数据传输。它源于JavaScript编程语言的一个子集,符合ECMA262第三版规范。尽管...
这篇"JSON学习笔记"可能涵盖了以下几个关键知识点: 1. JSON的基本结构:JSON数据由键值对(key-value pairs)组成,键和值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是字符串、数字、布尔值...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,设计用来简洁清晰地进行数据交换。JSON的结构与JavaScript的对象直接量和数组直接量非常相似,使得它对于JavaScript...
.【个人总结系列-24】JSON学习总结及CJson代码分析.docx
.【个人总结系列-24】JSON学习总结及CJson代码分析.pdf
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递...通过提供的jar包和学习资料,初学者可以快速掌握JSON的基本概念和使用方法,从而在实际项目中得心应手地处理数据。
在JavaScript中,XML(eXtensible Markup Language)和JSON(JavaScript Object Notation)是两种常见的...在学习过程中,实践是关键,尝试用JavaScript处理一些实际的XML和JSON数据,会让你更好地理解和掌握这些概念。
在JavaScript中,数组对象和JSON(JavaScript Object Notation)是两种非常重要的数据结构,它们在处理和存储数据方面起着核心作用。这篇学习笔记将深入探讨这两种数据结构的特性和用法。 首先,我们来了解...