`
songtianbao
  • 浏览: 29858 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

掌握 Ajax,第 11 部分: 服务器端的 JSON

阅读更多
文档选项
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td><td width="122"><p><b><a class="smallplainlink" href="javascript:print()">打印本页</a></b></p></td></tr>'); //--> <noscript></noscript> <noscript></noscript>
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送

<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas -->
<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

级别: 高级

Brett D. McLaughlin, Sr. (brett@newInstance.com), 作家兼编辑, O'Reilly Media, Inc.

2007 年 8 月 28 日

本系列最近发表的一篇文章中,您已经了解了如何将 JavaScript 对象转变成 JSON 格式。这种格式很容易用于发送(和接收)与对象甚至对象数组对应的数据。在 本系列 的最后一篇文章中,您将会学习如何处理以 JSON 格式发送到服务器的数据以及如何使用相同格式对脚本进行回复。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

JSON 的真正价值

正如在 本系列上一篇文章 中所描述的那样,JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值之间得以快速转换。由于 Ajax 应用程序非常适合将纯文本发送给服务器端程序并对应地接收纯文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 让您能够处理本地 JavaScript 对象,而无需为如何表示这些对象多费心思。

developerWorks Ajax 资源中心
请访问 Ajax 资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何关于 Ajax 的新信息都能在这里找到。

XML 也可以提供文本方面的类似益处,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API 成熟;有时,您必须在创建和处理 JavaScript 对象时格外谨慎以确保所进行的处理能与所选用的 XML 会话 API 协作。但对于 JSON,情况就大不相同:它能处理几乎所有可能的对象类型,并会返回给您一个非常好的 JSON 数据表示。

因此,JSON 的最大价值在于可以将 JavaScript 真的作为 JavaScript 而非数据格式语言进行处理。您所学到的所有有关使用 JavaScript 对象的技巧都可以应用到代码中,而无需为如何将这些对象转变成文本而多费心思。这之后,可以进行如下所示的简单 JSON 方法调用:

String myObjectInJSON = myObject.toJSONString();

现在就可以将结果文本发送给服务器了。





回页首


将 JSON 发给服务器

将 JSON 发给服务器并不难,但却至关重要,而且还有一些重要的选择要做。但是,一旦决定使用 JSON,所要做的这些选择就会十分简单而且数量有限,所以您需要考虑和关注的事情不多。重要的是能够将 JSON 字符串发送给服务器,而且最好能做到尽快和尽可能简单。

通过 GET 以名称/值对发送 JSON

将 JSON 数据发给服务器的最简单方法是将其转换成文本,然后以名称/值对的值的方式进行发送。请务必注意,JSON 格式的数据是相当长的一个对象,看起来可能会如清单 1 所示:


清单 1. JSON 格式的简单 JavaScript 对象
                
var people =  { "programmers": [    { "firstName": "Brett", "lastName":"McLaughlin",
"email": "brett@newInstance.com" },    { "firstName": "Jason", "lastName":"Hunter",
"email": "jason@servlets.com" },    { "firstName": "Elliotte", "lastName":"Harold",
"email": "elharo@macfaq.com" }   ],  "authors": [    { "firstName": "Isaac", 
"lastName": "Asimov", "genre": "science fiction" },    { "firstName": "Tad", 
"lastName": "Williams", "genre": "fantasy" },    { "firstName": "Frank", 
"lastName": "Peretti", "genre": "christian fiction" }   ],  "musicians": [    
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },   
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }   ]  }

如果要以名称/值对将其发送到服务器端,应该如下所示:

var url = "organizePeople.php?people=" + people.toJSONString();
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);

这看起来不错,但却存在一个问题:在 JSON 数据中会有空格和各种字符,Web 浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中)引起混乱,需要在 JavaScript escape() 函数中做如下添加:

var url = "organizePeople.php?people=" + escape(
people.toJSONString()
);
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 %20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。

这种做法的缺点有两个:

  • 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。
  • 在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。

简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON 数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。

利用 POST 请求发送 JSON 数据

当决定使用 POST 请求将 JSON 数据发送给服务器时,并不需要对代码进行大量更改,如下所示:

var url = "organizePeople.php?timeStamp=" + new Date().getTime();
request.open("POST", url, true);
request.onreadystatechange = updatePage;
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(people.toJSONString());

这些代码中的大部分,您都在 “ 掌握 Ajax,第 3 部分:Ajax 中的高级请求和响应” 中见过,应该比较熟悉,第 3 部分重点介绍了如何发送 POST 请求。请求使用 POST 而非 GET 打开,而且 Content-Type 头被设置为让服务器预知它能得到何种数据。在这种情况下,即为 application/x-www-form-urlencoded,它让服务器知道现在发送的是文本,正如它从常规的 HTML 表单中得到的一样。

另一个简单提示是 URL 的末尾追加了时间。这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发;此 URL 会由于时间戳的不同而稍微有些不同。这种技巧常被用于确保到脚本的 POST 每次都会实际生成新请求且 Web 服务器不会尝试缓存来自服务器的响应。

JSON 就只是文本

不管使用 GET 还是 POST,关键之处在于 JSON 就只是文本。由于不需要特殊编码而且每个服务器端脚本都能处理文本数据,所以可以轻松利用 JSON 并将其应用到服务器。假如 JSON 是二进制格式的或是一些怪异的文本编码,情况就不这么简单了;幸好 JSON 只是常规的文本数据(正如脚本能从表单提交中所接收到的数据,在 POST 段和 Content-Type 头中亦可以看出),所以在将数据发送到服务器时无需太费心。





回页首


在服务器上解释 JSON

一旦您编写完客户端 JavaScript 代码、允许用户与 Web 表单和 Web 页的交互、收集发送给服务器端程序以做处理所需的信息,此时,服务器就成为了应用程序(如果调用了异步使用的服务器端程序,则可能是我们认为的所谓的 “Ajax 应用程序”)中的主角。在此时,您在客户端所做的选择(比如使用 JavaScript 对象,然后将其转换成 JSON 字符串)必须要与服务器端的选择相匹配,比如使用哪个 API 解码 JSON 数据。

处理 JSON 的两步骤

不管在服务器端使用何种语言,在服务器端处理 JSON 基本上就需要两个步骤。

  1. 针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。
  2. 使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。

以上差不多就是目前所应了解的大致内容了。接下来,我们对每个步骤进行较为详细的介绍。

寻找 JSON 解析器

寻找 JSON 解析器或工具箱最好的资源是 JSON 站点(有关链接,请参阅 参考资料)。在这里,除了可以了解此格式本身的方方面面之外,还可以通过各种链接找到 JSON 的各种工具和解析器,从 ASP 到 Erlang,到 Pike,再到 Ruby,应有尽有。您只需针对自己编写脚本所用的语言下载相应的工具箱即可。为了让服务器端脚本和程序能够使用此工具箱,可以根据情况对其进行选择、扩展或安装(如果在服务器端使用的是 C#、PHP 或 Lisp,则可变性更大)。

例如,如果使用的是 PHP,可以简单将其升级至 PHP 5.2 并用它完成操作;在 PHP 这个最新版本默认包含了 JSON 扩展。实际上,那也是在使用 PHP 时处理 JSON 的最好方法。如果使用的是 Java servlet,json.org 上的 org.json 包显然就是个不错的选择。在这种情况下,可以从 JSON Web 站点下载 json.zip 并将其中包含的源文件添加到项目构建目录。编译完这些文件后,一切就就绪了。对于所支持的其他语言,同样可以使用相同的步骤;使用何种语言取决于您对该语言的精通程度,最好使用您所熟悉的语言。

使用 JSON 解析器

一旦获得了程序可用的资源,剩下的事就是找到合适的方法进行调用。比如,假设为 PHP 使用的是 JSON-PHP 模板:

// This is just a code fragment from a larger PHP server-side script
require_once('JSON.php');

$json = new Services_JSON();

// accept POST data and decode it
$value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']);

// Now work with value as raw PHP

通过该模板,可将获得的所有数据(数组格式的、多行的、单值的或 JSON 数据结构中的任何内容)转换成原生 PHP 格式,放在 $value 变量中。

如果在 servlet 中使用的是 org.json 包,则会使用如下代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

  StringBuffer jb = new StringBuffer();
  String line = null;
  try {
    BufferedReader reader = request.getReader();
    while ((line = reader.readLine()) != null)
      jb.append(line);
  } catch (Exception e) { //report an error }

  try {
    JSONObject jsonObject = new JSONObject(jb.toString());
  } catch (ParseException e) {
    // crash and burn
    throw new IOException("Error parsing JSON request string");
  }

  // Work with the data using methods like...
  // int someInt = jsonObject.getInt("intParamName");
  // String someString = jsonObject.getString("stringParamName");
  // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
  // JSONArray arr = jsonObject.getJSONArray("arrayParamName");
  // etc...
}

可以参考 org.json 包文档(有关链接,请参阅 参考资料 部分)以了解详细信息。(注意:如果想要获得有关 org.json 或其他 JSON 工具箱的详细信息,可以给我发电子邮件。您的来信会有助于我决定将来大概写的内容!)





回页首


结束语

至此,您应该从技术角度对如何在服务器端处理 JSON 有了基本的把握。本篇文章和本系列的 第 10 部分 不仅提供了技术层面的帮助,而且还向您展示了 JSON 是一种多么灵活、强大的数据格式。即使您不会在每个应用程序中都使用 JSON,但优秀的 Ajax 和 JavaScript 程序员的工具箱中总少不了 JSON 以备不时之需。

我当然很希望能够分享您的 JSON 使用经验以及您对何种语言更善于在服务器端处理 JSON 数据的高见。您可以访问 Java 和 XML 新闻组(有关链接,请参阅 参考资料 部分)跟我联系。享受 JSON 和文本数据格式的乐趣吧。



参考资料

学习

讨论


关于作者

Photo of Brett McLaughlin

Brett McLaughlin 从 Logo 时代就开始使用计算机。(还记得那个小三角吗?)近年来,他已经成为 Java 和 XML 社区最著名的作者和程序员之一。他曾经在 Nextel Communications 实现过复杂的企业系统,在 Lutris Technologies 编写过应用服务器,最近,他在 O'Reilly Media, Inc. 继续撰写和编辑这方面的图书。Brett 即将出版的新书 Head Rush Ajax 为 Ajax 带来了获奖的革命性 Head First 方法。最近的著作 Java 1.5 Tiger: A Developer's Notebook 是关于 Java 技术最新版本的第一本书。经典的 Java and XML 依然是在 Java 语言中使用 XML 技术的权威著作。



來自 http://www.ibm.com/developerworks/cn/web/wa-ajaxintro11.html
分享到:
评论

相关推荐

    掌握 Ajax第 11 部分--服务器端的 JSON.pdf

    ### 掌握Ajax系列之服务器端的JSON:深入解析与应用 #### 深入理解JSON在Ajax中的角色 在《掌握 Ajax第 11 部分--服务器端的 JSON.pdf》一文中,作者Brett D. McLaughlin详细阐述了JSON在Ajax应用程序中的重要性,...

    掌握 Ajax第 10 部分--使用 JSON 进行数据传输.pdf

    ### 掌握 Ajax 第 10 部分——使用 JSON 进行数据传输 #### 知识点一:理解 JSON 在 Ajax 中的作用 - **背景介绍**:随着 Web 应用程序的发展,Ajax(Asynchronous JavaScript and XML)技术成为了前端开发的重要...

    掌握Ajax 学习资料pdf

    掌握 Ajax第 1 部分-Ajax 简介 掌握 Ajax第 2 部分-使用 JavaScript 和 Ajax 发出异步请求 掌握 Ajax第 3 部分-Ajax 中的高级请求和响应 掌握 Ajax第 4 部分-利用 DOM 进行 Web...掌握 Ajax第 11 部分--服务器端的 JSON

    ASP.NET+AJAX程序设计(第一卷:服务器端)

    本文将深入探讨ASP.NET与AJAX在服务器端的程序设计基础及其核心概念。 **ASP.NET概述** ASP.NET是Microsoft .NET框架的一部分,提供了一套全面的工具和服务,用于构建动态、数据驱动的Web应用程序。它支持多种编程...

    服务器端的JSON

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、...了解和熟练掌握JSON的使用,对于提升服务器端程序的效率和用户体验至关重要。

    Ajax与Atlas开发系列课程:服务器端的AJAX应用

    **Ajax与Atlas开发系列课程:服务器端的AJAX应用**...通过学习这个系列课程,开发者不仅可以掌握Ajax的基本原理和使用方法,还能了解到如何在实际项目中高效地运用ASP.NET AJAX框架,从而提高Web应用的性能和用户体验。

    用ajax方式获得服务器端json的对象(文本)

    总的来说,通过Ajax获取服务器端的JSON数据是Web开发中的常见操作,掌握这一技能对于进行动态交互的Web应用开发至关重要。了解并熟练使用Ajax和JSON,能够帮助开发者更高效地构建前后端通信,提供流畅的用户体验。

    ajax+json实例

    通过理解并熟练掌握AJAX的异步通信机制以及JSON的数据交换格式,开发者能够构建出更加高效、流畅的Web应用。在实际开发中,还需要考虑错误处理、安全性、性能优化等多方面因素,确保系统的稳定性和可靠性。

    AjaxJson 实例 AjaxJson

    AJAX 允许前端通过 JavaScript 发起 HTTP 请求,获取服务器端的数据,然后在后台处理这些数据并更新部分页面内容。这种方式极大地提高了用户体验,因为页面的其他部分保持不变,用户无需等待整个页面重新加载。 ...

    XMLHttpRequest手册

    掌握 Ajax,第 11 部分: 服务器端的 JSON http://www.ibm.com/developerworks/cn/web/wa-ajaxintro11.html ) 2、《XMLHttpRequest手册.CHM》包含下列内容: XmlHttp对象参考: 属性: onreadystatechange* 指定当...

    前台ajax与后台json传递

    在后台,通常使用服务器端语言处理Json数据,如PHP、Python、Java或Node.js等。以PHP为例,接收Json数据并解析的代码如下: ```php header('Content-Type: application/json'); $data = file_get_contents('...

    下载json,ajax传送对象的好帮手

    当你在发送一个AJAX请求到服务器时,服务器端可以处理业务逻辑并生成一个JSON格式的响应。这个响应包含了需要传递给前端的数据,如用户信息、列表数据等。前端接收到这个响应后,可以简单地通过JavaScript解析JSON,...

    struts2+jquery执行ajax并返回json类型数据(源码)

    Struts2和jQuery是Web开发中的两个重要框架,它们结合使用可以实现动态、交互式的用户界面。...通过理解和实践这个示例,开发者可以进一步掌握Ajax通信和JSON数据交换的基本技巧,这对于开发现代Web应用至关重要。

    AJAX+json初学案例

    AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下更新部分网页内容的技术。在实际应用中,它常与JSON...通过学习和实践这样的案例,初学者可以逐步掌握AJAX和JSON在Web开发中的应用。

    SpringMVC利用Ajax,JQuery交互Json

    在现代Web应用开发中,SpringMVC作为Java服务器端的一个强大框架,经常被用来构建高效、可维护的后端服务。Ajax(异步JavaScript和XML)和JQuery库则为前端提供了灵活的数据交互方式,使得页面可以无刷新更新,提升...

    ajax+json程序代码

    通过这个小测试,初学者可以动手实践,从创建Ajax请求到解析JSON数据,再到与MySQL数据库的交互,逐步掌握这些核心概念。记住,理论学习固然重要,但实践才能真正巩固知识。所以,深入研究并运行提供的代码,遇到...

    JSP+Jquery+JSON 集合实现AJAX

    服务器端的JSP可以将处理后的数据转换成JSON格式,然后通过AJAX响应返回给客户端。 **集合实现** 在描述中提到的“集合实现”可能是指在服务器端使用Java集合(如ArrayList、HashMap等)来存储和处理数据。这些集合...

    ajax向springmvc传递json

    总结来说,Ajax向Spring MVC传递JSON涉及的主要步骤包括前端的数据序列化、Ajax请求的发起、服务器端的参数绑定、业务处理及响应的JSON化。理解并熟练掌握这一流程对于进行高效的前后端数据交互至关重要。在实际项目...

    Json数据解析服务器端加客户端代码

    通过学习这个压缩包中的代码,开发者可以掌握如何在实际项目中有效地处理JSON数据,包括序列化和反序列化,以及在服务器端和客户端之间进行数据交互。同时,理解JSON格式对于任何Web开发人员来说都是基础且必要的...

    jQuery ajax读取json文件内容

    在IT领域,jQuery作为一个流行的JavaScript库,被广泛用于简化HTML文档遍历、事件处理、动画以及与服务器交互等任务。...掌握这一技能,开发者可以更高效地处理服务器端和客户端之间的数据交换,提升用户体验。

Global site tag (gtag.js) - Google Analytics