`

JSON入门二

阅读更多

 

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

这些代码中的大部分,请求使用 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 包文档(有关链接,请参阅 参考资料 部分)以了解详细信息。 

分享到:
评论

相关推荐

    json入门教程入门教程

    JSON 入门教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于纯文本,易于人阅读和编写,同时也易于机器解析和生成。JSON 数据格式具有简单性、灵活性和跨平台、跨语言的特点,使其在 Web...

    JSON 入门指南--(PDF电子书+随书源码)免费

    本资源提供了一本“JSON入门指南”的PDF电子书,旨在帮助初学者快速掌握JSON的基本概念和用法。书中可能涵盖了以下几个方面: 1. **JSON基础**:介绍JSON的起源和特点,以及为什么在Web开发中如此重要。会讲解JSON...

    json入门基础教程

    ### JSON入门基础教程:理解与应用 #### 一、JSON概览 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,它使用了...

    json入门讲解的总结

    list.add("元素2"); JSONArray jsonArray = JSONArray.fromObject(list); String jsonString = jsonArray.toString(); ``` 反之,将JSON字符串解析为Java对象,可以使用`JSONArray.fromObject(jsonString)`或`...

    JSON入门与实战

    JSON(JavaScript Object Notation http://www. json .org/ json -zh.html ),是一种轻量级的基于文本且独立于语言的数据交换格式,比 XML 更轻巧,它是 XML 数据交换的一个替代方案。它源于 ECMAScript 程序语言...

    json入门

    JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,但它的影响力远远超越了JavaScript,成为各种编程语言间数据...

    JSON入门实战 (JAVA版)

    本教程将带你入门JSON,并通过Java进行实战操作。 一、JSON基本结构 1. JSON对象:由花括号{}包围,内部包含键值对,键与值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是各种数据类型,如字符...

    Java操作JSON入门教程

    Java操作JSON入门教程

    JSONF示例,JSON入门案例,JSON

    在这个"JSONF示例,JSON入门案例"中,我们有两个文件:`index.html`和`pro.php`。这个实例主要展示了如何通过AJAX(异步JavaScript和XML)从服务器端的PHP文件获取并处理JSON数据。 首先,`index.html`是一个HTML...

    json 入门 案列 很简单

    在压缩包中的"json入门(1)"文件,可能是包含了一些基本的JSON数据示例或者练习,用来帮助学习者动手操作,理解如何创建、解析和使用JSON。通过实际操作,你可以更加深入地了解JSON的语法和特性,同时掌握如何在AJAX...

    JSON入门教程.pdf

    JSON 入门教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。 JSON 是基于纯文本的数据格式,天生是为 JavaScript 准备的,因此 JSON 的数据...

    json入门,适合初学者

    JSON,全称JavaScript ...通过学习提供的“json入门”文档,初学者可以系统地了解JSON的基本概念、语法,并逐步掌握如何在实际项目中使用JSON进行数据交换。在实践中不断练习,才能真正熟练掌握这一重要的数据格式。

    json初学入门教程

    ### JSON初学入门教程知识点详解 #### 一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛应用于Web应用程序中进行数据传输。它以文本形式存储,具有简单易读的特点,并且能被...

    json 入门的指导

    2. **数组(Array)**: 数组是以方括号 `[]` 包围的一组有序值,值可以是任意类型,包括其他对象或数组。值之间同样用逗号 `,` 分隔。例如: ```json [ "apple", "banana", "orange" ] ``` 3. **值(Value)...

    Json 入门学习资料

    以下是一些关于JSON的基础知识和入门要点: 1. **JSON的结构**: JSON主要由两种基本结构组成: - 对象(Object):以花括号 `{}` 包裹,内部由一系列键值对(Key-Value)构成,键和值之间用冒号 `:` 分隔,键值...

    JSON入门教程-非常实用的JSON课件

    ### JSON入门教程——非常实用的JSON课件 #### 一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于一种简单的数据结构:对象和数组,易于人阅读和编写,同时也易于机器解析和...

    Json入门教程详解基础

    Json 入门教程详解基础 Json 是一种轻量级的数据交换格式,相比 XML 和 HTML 片段,它提供了更好的简单性和灵活性。Json 数据格式解析简单,易于阅读和编写,可以传输简单的 String、Number、Boolean,也可以传输...

    json入门博客资料

    在本压缩包中的“json入门博客资料”中,你可以找到一系列关于JSON的基础知识和在VS(Visual Studio)环境下如何进行开发的教程。 JSON是一种独立的语言无关的数据格式,但它与JavaScript语法高度相似。一个JSON...

Global site tag (gtag.js) - Google Analytics