<script language=JavaScript type=text/javascript> var Url_One="http%3A//etoow.com/html/2007-05/1179108630.html"; var Url_Two="http%3A//www.etoow.com/html/2007-05/1179108630.html"; var Url=escape(location.href); if(Url!=Url_One){ if(Url!=Url_Two){ window.location="http://www.etoow.com/html/2007-05/1179108630.html"; } } </script>整理日期:2007年06月8日
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);
// 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 + ")");
<script language=JavaScript type=text/javascript> var Url_One="http%3A//etoow.com/html/2007-05/1179108630-3.html"; var Url_Two="http%3A//www.etoow.com/html/2007-05/1179108630-3.html"; var Url=escape(location.href); if(Url!=Url_One){ if(Url!=Url_Two){ window.location="http://www.etoow.com/html/2007-05/1179108630-3.html"; } } </script>转自:伊图教程网[www.etoow.com]
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.name + "<br/>";
finalResponse += "<i>Address:</i> " + jsonContent.addressbook.address.street + " -- " +
jsonContent.addressbook.address.city + "," +
jsonContent.addressbook.address.zip + ".<br/>";
finalResponse += "<i>Telephone numbers:</i> " + jsonContent.addressbook.phoneNumbers[0] + " & " +
jsonContent.addressbook.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" οnchange="searchAddressBook()">
<option>A</option>
...
<option>Z</option>
</select>
</td><td valign="top">To:<br/>
<select id="toLetter" size="15" οnchange="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 。
Ajax(Asynchronous JavaScript and XML) 说到底就是一种浏览器异步读取服务器上 XML 内容的技术。现在的技术凡是跟 XML 扯上关系,再加上个概念做幌子,就像金装了一样,拽得不行。门外 的人看得很是热闹,门里的人摇摇头不外如是。 XML 呢,跨平台的新潮语言?其实 XML = TXT 。 XML 只是符合很多规范的文本。它本身什么都不是,只是保 存字符的文件。而浏览器异步读取的只是服务器上的文本内容,所以在 Ajax 开发时完全不必拘泥于 XML 。 [ 版权所有, www.jialing.net]
JSON 的来历
XML 的作用是格式化数据内容。如果我们不用 XML 还有什么更好的方法吗?这个答案是 JSON 。介绍 JSON 之前我先介绍一下 JavaScript 这门脚本语 言。脚本语言自身有动态执行的天赋。即我们可以把想要执行的语句放在字符串里,通过 eval() 这个动态执行函数来执行。字符串里的内容会像我们写的脚本 一样被执行。
示例 1 :
< HTML >
< HEAD >
< TITLE > eval example 1 < /TITLE >
< /HEAD >
< BODY >
< script >
str = "alert('hello')";
eval(str);
< /script >
< /BODY >
< /HTML >
打开页面会弹出 hello 窗口。
我们可以在字符串中放任何脚本语句,包括声明语句:
< HTML >
< HEAD >
< TITLE > eval example 2 < /TITLE >
< /HEAD >
< BODY >
< script >
define = "{name:'Michael',email:'17bity@gmail.com'}";
eval("data = "+define);
alert("name:"+data.name);
alert("email:"+data.email);
< /script >
< /BODY >
< /HTML >
如果我们在后台异步传来的文本是 JavaScript 的声明语句,那么不是一条 eval 方法就能解析了?对于解析复杂的 XML ,这样的效率是多么大的提高啊!
现在就来告诉你什么是 JSON : JavaScript Object Notation 。我更愿意把它翻译为 JavaScript 对象声明。比如要从后台载入一些通讯录的信息,如果写成 XML ,如下:
< contact >
< friend >
< name > Michael < /name >
< email > 17bity@gmail.com < /email >
< homepage > http://www.jialing.net < /homepage >
< /friend >
< friend >
< name > John < /name >
< email > john@gmail.com < /email >
< homepage > http://www.john.com < /homepage >
< /friend >
< friend >
< name > Peggy < /name >
< email > peggy@gmail.com < /email >
< homepage > http://www.peggy.com < /homepage >
< /friend >
< /contact >
而写成 JSON 呢:
[
{
name:"Michael",
email:"17bity@gmail.com",
homepage:"http://www.jialing.net"
},
{
name:"John",
email:"john@gmail.com",
homepage:"http://www.jobn.com"
},
{
name:"Peggy",
email:"peggy@gmail.com",
homepage:"http://www.peggy.com"
}
]
简单的不只是表达上,最重要的是可以丢弃让人晕头转向的 DOM 解析了。因为只要符合 JavaScript 的声明规范, JavaScrip 会自动帮你解析好 的。 Ajax 中使用 JSON 的基本方法是前台载入后台声明 JavaScript 对象的字符串,用 eval 方法来将它转为实际的对象,最后通过 DHTML 更新页面信息。
JSON 的基本格式如下,图片来自 json.org:
· 对象是属性、值对的集合。一个对象的开始于 "{" ,结束于 "}" 。每一个属性名和值间用 ":" 提示,属性间用 "," 分隔。
· 数组是有顺序的值的集合。一个数组开始于 "[" ,结束于 "]" ,值之间用 "," 分隔。
· 值可以是引号里的字符串、数字、 true 、 false 、 null ,也可以是对象或数组。这些结构都能嵌套。
· 字符串的定义和 C 或 Java 基本一致。
· 数字的定义也和 C 或 Java 基本一致。
· 可读性
JSON 和 XML 的可读
XML 天生有很好的扩展性, JSON 当然也有,没有什么是 XML 能扩展, JSON 不能的。
· 编码难度
XML 有丰富的编码工具,比如 Dom4j 、 JDom 等, JSON 也有 json.org 提供的工具,但是 JSON 的编码明显比 XML 容易许多,即使不借助工具也能写出 JSON 的代码,可是要写好 XML 就不太容易了。
· 解码难度
XML 的解析得考虑子节点父节点,让人头昏眼花,而 JSON 的解析难度几乎为 0 。这一点 XML 输的真是没话说。
· 流行度
XML 已经被业界广泛的使用,而 JSON 才刚刚开始,但是在 Ajax 这个特定的领域,未来的发展一定是 XML 让位于 JSON 。到时 Ajax 应该变成 Ajaj(Asynchronous JavaScript and JSON) 了。
<html>
<head>
<title>
JSON 示例
</title>
<script type="text/javascript" src="zxml.src.js"></script>
<script type="text/javascript" src="json.js"></script>
<script type="text/javascript">
var xmlHttp;
// 创建对象
function createXMLHttpRequest(){
xmlHttp = zXmlHttp.createRequest();
}
function doJSON(){
// 得到 Car 对象
var car = getCarObject();
// 用 JSON 字符串化 car 对象
var carAsJSON = car.toJSONString();
alert(" 汽车对象 JSON 化为 :/n" + carAsJSON);
var url = "JSONExample?timeStamp=" + new Date().getTime();
// 创建对象
createXMLHttpRequest();
xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.setRequestHeader("Content-Type","application/x-www-form.urlencoded");
xmlHttp.send(carAsJSON);
}
// 回调方法
function handleStateChange(){
if (xmlHttp.readyState == 4){
if (xmlHttp.status == 200){
parseResults();
}
}
}
// 解析结果
function parseResults(){
var responseDiv = document.getElementById("serverResponse");
if (responseDiv.hasChildNodes()){
responseDiv.removeChild(responseDiv.childNode[0]);
}
var responseText = document.createTextNode(xmlHttp.responseText);
responseDiv.appendChild(responseText);
}
// 得到 Car 对象
function getCarObject(){
return new Car("Dodge","Coronet R/T",1968,"yellow");
}
//Car 构造函数
function Car(make,model,year,color){
this.make = make;
this.model = model;
this.year = year;
this.color = color;
}
</script>
</head>
<body>
<br /><br />
<form action="#">
<input type="button" value=" 发送 JSON 数据 " οnclick="doJSON();"/>
</form>
<h2>
服务器响应:
</h2>
<div id="serverResponse">
</div>
</body>
</html>
import java.net.*;
import java.text.ParseException;
import javax.servlet.*;
import javax.servlet.http.*;
import org.json.JSONObject;
extends HttpServlet {
// 处理 Post 方法
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String json = readJSONStringFromRequestBody(request);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(json);
}
catch (ParseException pe) {
System.out.println("ParseException: " + pe.toString());
}
String responseText = "You have a " + jsonObject.getInt("year") + " "
+ jsonObject.getString("make") + " " + jsonObject.getString("model")
+ " " + " that is " + jsonObject.getString("color") + " in color.";
response.getWriter().print(responseText);
}
private String readJSONStringFromRequestBody(HttpServletRequest request) {
StringBuffer json = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ( (line = reader.readLine()) != null) {
json.append(line);
}
}
catch (Exception e) {
System.out.println("Error reading JSON string: " + e.toString());
}
return json.toString();
}
}