JSON是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。AJAX是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。之前也曾介绍过在PHP语言中使用JSON的文章,大家也可以看看,供参考。

虽然XML在Ajax运行中具有举足轻重的地位,但JavaScript开发人员很快就对它失去了兴趣。在JavaScript中操作XML存在严重的跨浏览器问题,而且从XML结构中提取数据也需要涉及遍历DOM文档,而这些操作都需要编写大量的代码。Douglas Crockford发明了一种叫JSON(JavaScript Object Notation)的数据格式却能够创建与XML相同的数据结构。JSON的基础是JavaScript语法中一个子集,特别是对象和数组字面量。JSON的设计意图是在服务器构建格式化数据,然后再将数据发送给浏览器。

由于JSON在JavaScript中相当于对象和数组,转换速度快,而且便于在JavaScript代码中访问,JSON在Ajax通信中越来越受开发人员的追捧。Web开发社区已经为几乎所有主流的语言都开发了JSON解析器和序列化器,使得通过服务器输出和使用JSON数据变得极为容易。

Douglas Crockford自己也维护着一个针对JavaScript的JSON序列化器/解析器,下载地址为http://www.json.org/js.html,可以去下载那个JavaScript文件,且该文件在所有浏览器都能正常使用。此外,IE8中包含了Crockford解析器的原生版本。

在Crockford的这个JSON库中,有一个全局对象,这个对象有两个方法:parse()和stringify()。其中,parse()方法接受两个参数:JSON文本和一个可选的过滤函数。在传入的文本是有效的JSON的情况下,parse()方法会返回传入数据的一个对象表示。下面是使用parse()方法的示例:

  1. var object=JSON.parse("()");

与直接使用eval()不同的是这里不需要为传入的文本加圆括号。

第二个参数是一个函数,这个函数以一个JSON键和值作为参数。要想让作为参数传入的的键出现有结果对象中,该函数必须返回一个值。它的返回值将成为结果对象中与指定键关联的值,因此也就为我们重写默认的解析机制提供了机会。换句话说,在这个函数中针对某个键返回undefined,就会从结果对象中移除该键。如下面的例子所示:

  1. var jsontext="{"\name\":\"WangGang\",\"age\":29,\"author\":true }";
  2. var object=JSON.parse(jsontext,function(key,value){
  3. switch(key){
  4. case "age": return value+1;
  5. case "author": return undefined;
  6. default: return false;
  7. }
  8. });
  9. alert(object.age) //30
  10. alert(object.author) //undefined

在以上代码中,过滤函数会为每个"age"键的值加1,会移除数据中的"author"键,其他值则会原样返回。于是,结果对象中的age属性值就变成了30,但是却没有author属性,这种解析功能经常用于处理服务器返回的数据。假设addressbook.php会以下面的格式返回JSON数据:

  1. {
  2. {
  3. "name":"WangMeng",
  4. "email":"wangmeng@some-domain-name.com"
  5. },{
  6. "name":"LinTao",
  7. "email":"linTao@some-domain-name.com"
  8. },{
  9. "name":"Jim",
  10. "email":"jim@some-domain-name.com"
  11. }
  12. }

可以发送一个Ajax请求取得以上数据,然后在客户端使用下列代码生成相应的<ul/>元素:

  1. var xhr=createXHR();
  2. xhr.onreadystatechange=function(){
  3. if(xhr.readyState == 4){
  4. if((xhr.status >= 200 && xhr.status < 300)|| xhr.status == 304){
  5. var contacts=JSON.parse(xhr.responseText);
  6. var list=document.getElementById("contacts");
  7. for(var i=0,len=contacts.length;i<len;i++){
  8. var li=document.createElement("li");
  9. li.innerHTML="<a href=\"mailto:" + contacts[i].email + "\">" + contacts[i].name + "</a>";
  10. list.appendChild(li);
  11. }
  12. }
  13. xhr.open("get","addressbook.php",true);
  14. xhr.send(null);
  15. }
  16. };

以上代码从服务器取得了JSON字符串,然后将它解析成了JavaScript数组,得到数组后,通过迭代遍历其中的每个对象,很容易就可以将相应的值插入到DOM中。具体来说,<ul/>元素会包含一些<li/>元素,而每个<li/>元素则会包含一个链接,点击可以向一个人发送电子邮件。

JSON同样也是向服务器发送数据的浏览格式。发送数据时,一般会把JSON放到POST元素请求主体中,而JSON对象的stringify()方法正是为此而设计的。这个方法接受3个参数:要序列化的对象,可选的替换函数(用于替换未接受的JSON值)和可选的缩进说明符(可以是每个级别缩进的空格数,也可是用来缩进的字符)。默认情况下,stringify()返回未经缩进的JSON字符串,下面是一个例子:

  1. var contact={
  2. name:"WangMeng",
  3. email:"wangmeng@some-domain.com"
  4. };
  5. var jsontext=JSON.stringify(contact);
  6. alert(jsontext);

这个例子中的警告框会显示下列未经缩进的字符串:
(\"name\":\"wangmeng\",\"email\":\"wangmeng\":\wangment@some-domain.com\)

由于并不是所有JavaSrcipt值都可以使用JSON表示,因此结果中只会包含那些正式得到支持的值。例如,函数和undefined值无法通过JSON表示,包含它们的任何键默认都将被移除。要改变这个默认的行为,可以在第二个参数的位置传入一个函数。在序列化过程
中每当遇到一个不支持的数据类型时,该函数就会在被序列化的对象中作用域中运用,其参数是相应的键和值。

对于JSON支持的数据类型,序列化过程中不会调用这个函数,这些类型包括:字符串、数值、布尔值、null、对象、数组和Date。来看下面的例子:

  1. var jsontext=JSON.stringify([new Function()],function(key,value){
  2. if(value instanceof Function){
  3. return "(function)";
  4. }else{
  5. return value;
  6. }
  7. });
  8. alert(jsontext); //"(function)"

这个例子试图序列化一个包含函数的数组。当遇到函数值时,第二个参数(即过滤函数)会将它转换为字符串"(function)",该字符串将出现在最终结果中。

使用POST请求并将JSON文本传递给send()方法,可以将JSON数据发送给服务器。来看下面的例子:

  1. var xhr=createXHR();
  2. var contact={
  3. name:"wangmeng",
  4. email:"wangmeng@some-domain.com"
  5. };
  6. xhr.onreadystatechange=function(){
  7. if(xhr.readyState == 4){
  8. if((xhr.status <= 200 && xhr.status < 300) || xhr.status == 304){
  9. alert(xhr.responseText);
  10. }
  11. }
  12. };
  13. xhr.open("post","addcontact.php",true);
  14. xhr.send(JSON.stringify(contact));

这个例子是要将新联系人信息保存到服务器,因此要将数据发送给addcontact.php文件。在根据新联系人信息构建好contact对象后,又将它序列化为JSON数据并传递给send()方法。服务器上的PHP页面负责将接受到的JSON数据解析回原来的格式,以便服务器端代码能够理解,同时还会向浏览器发送响应。

谈JSON在Ajax中的使用的更多相关文章

  1. AJAX中的dataType(数据格式)-text、json

    因为经常使用数据格式,所以将它封装成类,J这样就不会用到时就写了,直接调用写好的类就可以了 (1)dataType数据格式为:TEXT格式的数据是字符串的数据,在"ajax对数据进行删除和查 ...

  2. Ajax中的JSON格式与php传输过程的浅析

    在Ajax中的JSON格式与php传输过程中有哪些要注意的小地方呢? 先来看一下简单通用的JSON与php传输数据的代码 HTML文件: <input type="button&quo ...

  3. JSON 在Ajax数据交换中的简单运用

    随着浏览器内核更新,原先的json.js在最新的谷歌浏览下不管用了,运行报错,特此修改下代码,不使用json.js,使用Object自带的json转换方法,修改时间,2016年10月26日. 首先需要 ...

  4. 快速掌握Ajax-Ajax基础实例(Ajax返回Json在Java中的实现)

    (转)实例二:Ajax返回Json在Java中的实现 转自http://www.cnblogs.com/lsnproj/archive/2012/02/09/2341524.html#2995114 ...

  5. Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题

    //php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_av ...

  6. ajax中的json和jsonp详解

    出现的问题: 花了点时间研究ajax中的json和jsonp的原理,这里记录一下.以前一直在使用ajax调用数据,但是从来没有遇到跨域问题,也从来没有注意过json和jsonp的区别,总是一通乱用.但 ...

  7. ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候,刚开始向后台传递数据返回415,后来百度添加了 contentType:"application/json"之后返回400,然后把传输的数据格式改为json ...

  8. [转] $.ajax中contentType: “application/json” 的用法

    不使用contentType: “application/json”则data可以是对象 $.ajax({ url: actionurl, type: "POST", datTyp ...

  9. WebForm下的$.ajax中contentType: “application/json” 的用法

    不使用contentType: “application/json”则data可以是对象 $.ajax({ url: actionurl, type: "POST", datTyp ...

随机推荐

  1. 开发自己的cordova插件

    如果还没有配置过cordova环境,首先要下载nodejs,(下载地址https://nodejs.org/)下载完毕安装. 控制台: 1.输入npm -v 确定是否装上了 2.输入sudo npm ...

  2. C# XML文件操作类XmlHelper

    类的完整代码: using System;using System.Collections;using System.Xml; namespace Keleyi.Com.XmlDAL{public c ...

  3. IE6解决固定定位代码

    有些朋友在进行网页布局时,会遇到IE6浏览器不支持固定定位的兼容性问题,本博将详细介绍此问题的解决方法,需要了解的朋友可以参考下. ie6 垂直居中固定定位,代码如下: #center {_posit ...

  4. PS2251-07 海力士(金士顿U盘量产,成功!)

    U盘挂掉了,用芯片无忧测到是这个样子的,看到是PS2251-07 海力士的 网上找了很多方法都不成功,最后找到了两个可以量产成功的方法,建议使用第一种. 首先,附上三个检测工具 芯片无忧.GetInf ...

  5. js 强制转换

    强制转换为布尔类型: <script> var text =Boolean(0) //=>以下转换的类型都为false text = Boolean(0.0) text = Bool ...

  6. Linux删除用户

    删除用户 # userdel abc 该删除操作将用户删除但保留用户的home文件夹和邮件文件夹.并且当用户abc正在登录的时候,删除操作将失败,如下: # userdel abc userdel: ...

  7. 解决JsonFormat日期少一天问题

    使用Jackson的@JsonFormat注解时出现少一天 比如数据库存的日期是2015-01-05,转成json则变成了2015-01-04 解决办法: @JsonFormat(pattern=&q ...

  8. iOS9 未受信任的企业级开发者

    升级iOS9,app打不开怎么办?6个步骤让你应对“未受信任的企业及开发者账号” 点开App,弹出未受信任的开发者,记住弹框中冒号后面的大写字母.关闭,进入设置. 进入通用 进入描述文件 找到所对应的 ...

  9. text-decoration属性

    一.在CSS1中,text-decoration有六个值: text-decoration:none  //默认,定义标准的文本,没有任何样式,正常显示 text-decoration:underli ...

  10. JS拖动div的原理

    要实现移动窗体,首先要捕获三个参数:1.a = 鼠标点击时的坐标.2.b = 被移动窗体的左顶点坐标.3.c = 鼠标移动时的坐标.然后还要算出你鼠标无论点击窗体哪个位置,移动改变的都是 (d = 窗 ...