服务器端的JSON_第1页
服务器端的JSON_第2页
服务器端的JSON_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、服务器端的 JSON在 本系列最近发表的一篇文章中 ,您已经了解了如何将 JavaScript 对象转变成 JSON 格式。这种格式 很容易用于发送 (和接收与对象甚至对象数组对应的数据。 在 本系列 的最后一篇文章中 ,您将会学习 如何处理以 JSON 格式发送到服务器的数 据以及如何使用相同格式对脚本进行回复。JSON 的真正价值正如在 本系列上一篇文章 中所描述的那样 , JSON 是适用于 Ajax 应用程序的 一种有效格式 , 原因是它 使 JavaScript 对象和字符串值之间得以快速转换。 由于 Ajax 应用程序非常适合将纯文本发送给服务器 端程序并对应地接收纯文本 , 相比

2、不 能生成文本的 API, 能生成文本的 API 自然更可取; 而且, JSON 让 您能够处理本地 JavaScript 对象 ,而无需为如何表示这些对象多费心思。 developerWorks Ajax 资源中心 请访问 Ajax 资源中心 , 这 是有关 Ajax 编 程模型信 息的一站式中心 ,包括很多 文档、教程、论坛、 blog 、 wiki 和新闻。任 何关于 Ajax 的新信息都能在这里 找到。XML 也可以提供文本方面的类似益处 ,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API 成熟 ;有时 ,您必须在创建和处理 JavaScr

3、ipt 对象时格外谨慎以确保所进行的处理能与所选用的 XML 会 话 API 协作。 但对于 JSON, 情况就大不相同 :它能处理几乎所有可能的对象类型 ,并会返回给您一个非常好的 JSON 数据表示。因此, JSON 的最大价值在于可以将 JavaScript 真的 作为 JavaScript而非数据格式语言进行处理。 您所学到的所有有关使用 JavaScript 对象的技巧都可以应用到代码中 ,而无需为如何将这些对象转变成文本而多费心思。这之后 ,可以进行如下所示的简单 JSON 方法调用 :String myObjectInJSON =myObject.toJSONString(;现在

4、就可以将结果文本发送给服务器了。回页首将 JSON 发给服务器将 JSON 发给服务器并不难 , 但却至关重要 , 而且还有一些重要的选择要做。 但是, 一旦决定使用 JSON, 所要做的这些选择就会十分简单而且数量有限 ,所以您需 要考虑和关注的事情不多。重要的是能够将 JSON 字符串发送给服务器 ,而且最好 能做到尽快和尽可能简单。通过 GET 以名称 /值对发送 JSON将 JSON 数据发给服务器的最简单方法是将其转换成文本 ,然后以名称 /值对的 值的方式进行发送。请务 必注意, JSON 格式的数据是相当长的一个对象 ,看起来可 能会如清单 1 所示 :清单 1. JSON 格式

5、的简单 JavaScript 对象var people = "programmers": "firstName": "Brett", "lastName":"McLaughlin", "email": "" , "firstName": "Jason", "lastName":"Hunter", "email": "" , "f

6、irstName": "Elliotte", "lastName":"Harold", "email": "" , "authors": "firstName": "Isaac","lastName": "Asimov", "genre": "science fiction" , "firstName": "Tad&q

7、uot;, "lastName": "Williams", "genre": "fantasy" , "firstName": "Frank","lastName": "Peretti", "genre": "christian fiction" , "musicians": "firstName": "Eric", "last

8、Name": "Clapton", "instrument": "guitar" , "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" 如果要以名称 /值对将其发送到服务器端 ,应该如下所示 :var url = "organizePeople.php?people=" + people.to

9、JSONString(;xmlHttp.open("GET", url, true;xmlHttp.onreadystatechange = updatePage;xmlHttp.send(null;这看起来不错 ,但却存在一个问题 :在 JSON 数据中会有空格和各种字符 , Web 浏览器往往要尝试对其 继续编译。要确保这些字符不会在服务器上 (或者在将数据 发送给服务器的过程中引起混乱 ,需要在 JavaScript escape函( 数中做如下添加 :var url = "organizePeople.php?people=" + escape(

10、people.toJSONString( ; request.open("GET", url, true;request.onreadystatechange = updatePage;request.send(null;该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符 (比如, 空格会被转换成 %20,浏览器并不会将其视为空格处理 ,而是 不做更改 ,将其直接传递到服务器。之后 , 服务器会 (通常自动再把它们转换回它们 传输后的本来“面 目”。这种做法的缺点有两个?在使用 GET 请求发送大块数据时 ,对 URL 字符串有长度限制

11、。虽然这个限制 很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象 ,尤其是在使用极其复 杂的对象时更是如此。 ?在跨网络以纯文本发送所有数据的时候 ,发送数据面临的不 安全性超出了您的处理能力。简言之,以上是 GET 请求的两个限制 ,而不是简单的两个与 JSON 数据相关的事 情。在想要发送用户名和姓之外的更多内容 ,比如表单中的选择时 ,二者可能会需要 多加注意。若要处理任何机密或极长的内 容,可以使用 POST 请求。利用 POST 请求发送 JSON 数据当决定使用 POST 请求将 JSON 数据发送给服务器时 ,并不需要对代码进行大 量更改,如下所示:var url =

12、 "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,

13、第 3 部分 :Ajax 中的高级请求和响 应”中 见过,应该比较熟悉,第 3 部分重点介绍了如何发送 POST 请求。请求使用 POST 而非 GET 打开,而且Content-Type 头被设置为让服务器预知它能得到何种数据。在这种情况下 ,即 为application/x-www-form-urlencoded,它让服务器知道现在发送的是文本 ,正如它从常规的 HTML 表单中得到的一样另一个简单提示是 URL 的末尾追加了时间。这就确保了请求不会在它第一次 被发送后即缓存 ,而是会在此方法每次被调用后重新创建和重发 ;此 URL 会由于时 间戳的不同而稍微有些不同。这种技巧常被用于 确

14、保到脚本的 POST 每次都会实 际生成新请求且 Web 服务器不会尝试缓存来自服务器的响应。JSON 就只是文本不管使用 GET 还是 POST,关键之处在于 JSON 就只是文本。由于不需要特殊 编码而且每个服务器端 脚本都能处理文本数据 ,所以可以轻松利用 JSON 并将其应 用到服务器。假如 JSON 是二进制格式的或是一些怪异的文本编码 ,情况就不这么 简单了;幸好 JSON 只是常规的文本数据 (正如脚本能从表单提 交中所接收到的数据 在 POST 段和 Content-Type 头中亦可以看出 , 所以在将数据发送到服务器时 无需太 费心。回页首在服务器上解释 JSON一旦您编写

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

16、JSON 解析器 /工具箱 /帮助器 API2. 使用 JSON 解析器 /工具箱 /帮助器 API 取得来自客户机的请求数据并将数 据转变成脚本能理 解的东西。以上差不多就是目前所应了解的大致内容了。接下来 ,我们对每个步骤进行较 为详细的介绍。寻找 JSON 解析器寻找 JSON 解析器或工具箱最好的资源是 JSON 站点(有关链接 ,请参阅 参考资 料 。在这里 , 除了 可以了解此格式本身的方方面面之外 , 还可以通过各种链接找到 JSON 的各种工具和解析器 , 从 ASP 到 Erlang ,到 Pike,再到 Ruby,应有尽有。您只需 针对自己编写脚本所用的语言下载相应的工具箱

17、即可。 为了让服务器端脚本和程 序能够使用此工具箱 ,可以根据情况对其进行选择、扩展或安装 (如果在服务器 端使 用的是 C#、 PHP 或 Lisp,则可变性更大。例如,如果使用的是 PHP,可以简单将其升级至 PHP 5.2 并用它完成操作 ;在 PHP 这个最新版本默认 包含了 JSON 扩展。实际上 ,那也是在使用 PHP 时处理 JSON 的 最好方法。如果使用的是 Java servlet , 上 的 org.json 包显然就是个不错的选 择。在这种情况下 ,可以从 JSON Web 站点 下载 json.zip 并将其中包含的源文件添 加到项目构建目录。编译完这

18、些文件后 ,一切就就绪了。对于所 支持的其他语言 ,同 样可以使用相同的步骤 ;使用何种语言取决于您对该语言的精通程度 ,最好使用您所 熟悉的语言。使用 JSON 解析器一旦获得了程序可用的资源 ,剩下的事就是找到合适的方法进行调用。比如 ,假 设为 PHP 使用的是 JSON-PHP 模板:/ This is just a code fragment from a larger PHP server-side scriptrequire_once('JSON.php'$json = new Services_JSON(;/ accept POST data and decod

19、e 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 Ser

20、vletException, IOException StringBuffer jb = new StringBuffer(;String line = null;try BufferedReader reader = request.getReader(;while (line = reader.readLine( != nulljb.append(line; catch (Exception e /report an error try JSONObject jsonObject = new JSONObject(jb.toString(; catch (ParseException e / crash and burnthrow new IOException("Error parsing JSON request string"/ Work with the data using methods like./ int some

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论