Ajax和WEB服务数据格式:JSON JSONP

开发 后端 前端
JSON和JSONP已经是现在最流行的异步交互的数据格式了。但是在压缩传输数据大小的方面还是可以再研究的。

之前的文章中我们讲到了早期的集中数据格式,XML,SOAP,HTML。现在,我们来看看JSON和JSONP。

JSON

JSON(JavaScript Object Notation)是Douglas Crockford提出的。他是一个轻量级的数据交换格式,基于JavaScript对象字面量。

我们可以将之前的XML图书格式的文件内容转换成下面的JSON格式:

  1. [  
  2.    {  
  3.        title: "The Principles of Beautiful Web Design, 2nd Edition",  
  4.        url: "http://www.sitepoint.com/books/design2/",  
  5.        author: "Jason Beaird",  
  6.        publisher: "SitePoint",  
  7.        price: {  
  8.            currency: "USD",  
  9.            amount: 39.95  
  10.         }  
  11.     },  
  12.     {  
  13.         title: "jQuery: Novice to Ninja",  
  14.         url: "http://www.sitepoint.com/books/jquery1/",  
  15.         author: "JEarle Castledine & Craig Sharkie",  
  16.         publisher: "SitePoint",  
  17.         price: {  
  18.             currency: "USD",  
  19.             amount: 29.95  
  20.         }  
  21.     },  
  22.     {  
  23.         title: "Build Your Own Database Driven Website",  
  24.         url: "http://www.sitepoint.com/books/phpmysql4/",  
  25.         author: "Kevin Yank",  
  26.         publisher: "SitePoint",  
  27.         price: {  
  28.             currency: "USD",  
  29.             amount: 39.95  
  30.         }  
  31.     }  

这是一个通过对象来表示书的一种方式,并且有title、url、author、publisher、和price等信息。price是一个子对象,并且他包含货币类型和价格。

在JavaScript中很容易处理JSON。你可以使用浏览器原生的JSON.parse方法或者Douglas Crockford的JSON-js库。就算这些都不能用,你也可以使用javaScript的eval方法。不需要再写额外的处理数据的方法:

  1. var json = xhr.responseText;  
  2. var book = JSON.parse(json);  
  3. alert(book[0].title); //first book title  
  4. alert(book[1].url); //second book URL 

使用JSON的优点在于:

◆ 比XML轻了很多,没有那么多冗余的东西

◆ JSON也是具有很好的可读性的,但是通常返回的都是压缩过后的。不像XML这样的浏览器可以直接显示,浏览器对于JSON的格式化的显示就需要借助一些插件了

◆ 在JavaScript中处理JSON很简单

◆ 其他语言例如PHP对于JSON的支持也不错

JSON也有一些劣势:

◆ JSON在服务端语言的支持不像XML那么广泛,不过JSON.org上提供很多语言的库

◆ 如果你使用eval()来解析的话,会容易出现安全问题

尽管如此,JSON的优点还是很明显的。他是Ajax数据交互的很理想的数据格式。

JSONP (JSON-p)

如果你使用XMLHttpRequest来调用JSON的web服务,返回的数据可以通过JSON.parse()或者eval()来处理。你也可以使用Ajax组件来做脚本的插入,例如,将远程加载的脚本插入在DOM节点中,通过script标签调用:

  1. var script = document.createElement("script");  
  2. script.src = "http://webservice.com/?a=1&b=2";  
  3. document.getElementsByTagName("head")[0].appendChild(script); 

跟XMLHttpRequest不同,插入script标签可以在不同源的情况下获取其他服务的数据。这对于流量分析、书签工具、小插件、广告系统来说是很理想的选择。

不过,返回的JSON数据通常都是当做本地的代码立即执行。也不会赋值给变量,所以后面就再访问不到了。不过这个问题我们可以通过给网络服务传递一个callback参数来进行回调:

  1. var script = document.createElement("script");  
  2. script.src = "http://webservice.com/?a=1&b=2&callback=MyDataHandler";  
  3. document.getElementsByTagName("head")[0].appendChild(script); 

这时候,网络服务通常会返回一个包含在一个回调函数中的JSON数据,这就是JSONP,或者“JSON with padding”,看看代码:

  1. MyDataHandler([  
  2.     {  
  3.         title: "The Principles of Beautiful Web Design, 2nd Edition",  
  4.         url: "http://www.sitepoint.com/books/design2/",  
  5.         author: "Jason Beaird",  
  6.         publisher: "SitePoint",  
  7.         price: {  
  8.             currency: "USD",  
  9.             amount: 39.95  
  10.          }  
  11.      }  
  12.      ...  
  13. ]); 

在JSON对象下载完毕之后,作为参数传递给了MyDataHandler()方法。

JSON和JSONP已经是现在最流行的异步交互的数据格式了。但是在压缩传输数据大小的方面还是可以再研究的。RockUX会在后面讲到关于自定义数据返回。

原文链接:http://rockux.com/

看看这一系列其他的文章:

Ajax和WEB服务数据格式:XML SOAP HTML

【编辑推荐】

  1. 使用 jQuery 简化 Ajax 开发
  2. 用Dojo实现Ajax请求:XHR、跨域、及其他
  3. 盘点ASP.NET Ajax工具箱的10大顶级控件
  4. 简化开发流程 了解各种Ajax框架的适用性
  5. Ajax安全隐患将成站点定时炸弹
责任编辑:陈贻新 来源: RockUX
相关推荐

2011-04-07 10:15:00

AjaxWeb

2011-04-11 13:14:58

AjaxWEB服务

2009-03-09 09:34:56

AjaxHTMLJavaScript

2010-01-06 14:04:55

Json数据格式

2013-03-27 10:51:44

iOSjson解析网络交互数据格式解析

2009-09-07 19:02:07

JSON是什么

2014-08-12 10:15:42

数据格式JSONXML

2010-01-06 13:23:20

JSON数据格式

2024-04-15 13:13:04

PythonJSON

2024-02-19 15:38:08

JsonPython字符串

2011-05-26 13:54:04

Json

2010-07-09 10:42:38

HART协议

2021-11-11 23:16:33

前端数据格式Web

2011-03-07 15:01:42

MySQLXML数据

2009-01-16 10:43:00

Web开发AJAX

2010-07-09 10:27:33

SQL Server数

2010-06-28 09:09:24

SQL Server

2022-06-05 14:57:35

发送钉钉运维架构

2012-03-27 15:23:15

JSONPAJAX

2012-08-01 14:16:27

IBMdW
点赞
收藏

51CTO技术栈公众号