与你分享JSON与JSONP的“故事”

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构: 

1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。   

2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。  
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。JSON具有以下这些形式: 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

[例一]

Date.prototype.getCurrentDate=function(){
var mydate=new Date();
return mydate.getFullYear()+"年"+mydate.getMonth()+"月"+mydate.getDay()+"日";
};
//JSON第一种结构方式
var myjson={"name":"FeiHu","today":function(){return new Date().getCurrentDate();}};
alert("报告:"+myjson.name+",今天是:"+ myjson.today());

[例二]

//JSON第二种结构方式,结合第一种结构
var myjson2=["苹果","橘子","香蕉","草莓",{"a":"北京","b":"上海","c":"石家庄"}];
alert(myjson2[4].a);

JSONP背景

Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。

不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?

理解同源策略限制

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。 克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用 GET 请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。

克服该限制更理想方法是在 Web 页面中插入动态脚本元素,该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的,因为同源策略不阻止动态脚本插入,并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档,就不会成功。幸运的是,通过添加 JavaScript Object Notation (JSON) 可以改进该技术。

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。

就是我们常用的语句:<script type=”text/javascript” src=”XXX/test.php?jsonp=callbackFunction” />

只是在外调过程中增加了客户端的回调处理函数,这个函数由服器端动态组装,发给客户端执行,如:

$jsonData = getDataAsJson($_GET[''a'']);
echo $_GET[''callback''] . ''('' . $jsonData . '');'';
// prints: jsonp1232617941775({"a" : "hello", "b" : "world"});

我要评论!

想一个你喜欢的昵称。
给一个你的常用邮箱。
想和萌萌哒的TA们说点啥。
  • 首先解释一下分配单元大小的含义:所谓分配单元大小,即是系统对磁盘以及移动存储设备进行读写的最小单位。 在极限速度以内,分配单元大小设置越大读写速度越快,反之则越慢。但是这里要注意一个问题,单元分配越大越会造成空间的浪费,这就好比你拿许多同样大小的正方形纸片要将一个形状完全覆盖,纸片的面积越大越省事,...
  • 一、安装Tomcat和JDK 1、上传apache-tomcat-6.0.18.tar.gz和jdk-6u12-linux-i586.bin至/usr/local 2、执行如下命令安装tomcat: #cd /usr/local #tar zxvf apache-tomcat-6.0.18.tar....
  • 主要特征:散装的没有散热器,质包是一年,而盒装的是带了散热器的,质包是三年 技术角度:散装和盒装CPU并没有本质的区别,至少在质量上不存在优劣的问题。 理论角度:盒装和散装产品在性能、稳定性以及可超频潜力方面不存在任何差距,但是质保存在一定差异。 一、散装与盒装的区别 从技术角度而言,散装和盒装CP...
  • Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务。请求的拦截和修改、扫描web应用程序漏洞、以暴力破解登陆表单、执行会话令牌等多种的随机性检查。 1.代理。Burp Suite带有一个代理,通过默认端口8080上运行,使用这个代理可以截获并修改从客户端到web...
  • 说实话这方面网上一搜一堆,但是真正能让用户明白的却少之又少。好了,我们开始。 认识下location: 语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码...
微信扫一扫即可带走我!