首页 理论教育PHPMVC开发实战:返回Json结果

PHPMVC开发实战:返回Json结果

【摘要】:Json使用JavaScript对象语法,能够以简单的语法格式对JavaScript对象进行表示。ajaxReturn默认情况下就是返回Json格式数据,能够方便地与前台Ajax实现高效互动,如以下代码所示。Jsonp请求数据时,会在url追加cakebale回调函数,Json数据必须回应该函数,才能绕过浏览器的安全策略,实现跨域通信。在Ajax异步请求时只需要为callback传入回调标识名称,即可实现Jsonp通信。

Json是一种轻量级的数据交换格式,它的英文全称为JavaScript Object Notation。Json使用JavaScript对象语法,能够以简单的语法格式对JavaScript对象进行表示。虽然其中带有JavaScript名称,但事实上Json是一种独立的开放式的数据交互格式,在主流的语言或框架中均提供有相应的Json序列化及反序列化类库。

Json与XML类似,都是进行数据交互的常用格式,并且都支持本地与Ajax远程通信(Json需借助于Jsonp协议),但是Json不需要定义标签,数据得到极大地压缩,所以相对来讲Json比XML传输效率更加出色。同时由于Json本质上是一种序列化文本,所以Json不需要特定的解释引擎,在JavaScript脚本中甚至只需要使用for语句或eval()函数也可以对数据进行提取。

正是由于Json的简单、轻巧及稳定,近年来已被各大网站纷纷使用,典型的应用有网站开放API、UI前后台分离、Ajax异步请求等。对于PHP开发人员而言,使用Json是非常方便的,PHP 5.x本身就内置了json_encode及json_decode函数,用于实现数组数据序列化及反序列化。下面将结合ThinkPHP深入介绍Json在MVC开发中的实际应用。

1.json_encode函数

json_encode函数是PHP 5.x内置的一个标准函数,该函数用于实现对数组进行Json格式序列化。json_encode的使用非常简单,如以下代码所示。

json_encode只能接受utf-8编码的数据,如果当前文档不为utf-8,需要使用iconv等函数进行编码转换。上述代码的转换结果如下代码所示。

可以看到,json_conde函数将标准的数组信息转换为了紧凑的字符串信息,这种被序列化后的字符串也是使用键值对来描述的,例如age的键值为20,使用“:”进行分隔(相等于数组中的=>),多个键值对之间使用“,”分开。可以看到Json没有标签或节点的概念,所有数据都是序列化后的键值对,这无论对开发效率还是传输效率都是非常高效的。

2.ajaxReturn方法

ajaxReturn方法前面已经有过深入地介绍,在此不再重述。ajaxReturn默认情况下就是返回Json格式数据,能够方便地与前台Ajax实现高效互动,如以下代码所示。(www.chuimin.cn)

上述代码的运行结果如下代码所示。

与生成xml数据一样,status、info及data这3个Json序列键都是系统自动生成的,方便Ajax编程。其中status表示状态;info表示提示信息;data用于存放序列化后的数组数据。Json与数组一样,支持多维嵌套,例如data键对应的值就是一个Json序列,所以直接输出select结果也是允许的,如以下代码所示。

3.实现Jsonp

前面已经提到过Json实现本地和远程Ajax通信是基于Jsonp的。Jsonp是一种通信方式,这一点初学者往往将其与Json混淆,事实上它们是两个完全不同的概念,简单地说Jsonp是通信方式,Json是数据格式。用过Ajax编程的读者应该了解Ajax默认情况下是不允许跨域请求的,所以要实现与远程(跨域名)的xml、JavaScript、html等数据进行通信,必须设置请求代理,例如实现iframe、本地储存等或者添加同源组策略(适用于Windows)。好在现在的JavaScript面向对象编程全部封装了这些操作(包括各种框架,例如jquery、extjs等),开发人员需要做的步骤其实非常少。但Json不同,Json是一种序列化的数据(相当于纯文本),所以本身不具备跨域通信的能力(没有用于代理回调的标记),为了解决Json跨域通信的问题,所以Jsonp就应运而生了。

Jsonp请求数据时,会在url追加cakebale回调函数,Json数据必须回应该函数,才能绕过浏览器的安全策略,实现跨域通信。所以要让json_encode序列化的Json能够用于跨域处理,只需要加入回调函数标识即可,如以下代码所示。

将上述自定义函数保存到Common.php文件中,在控制器动作中直接调用即可,如以下代码所示。

在Ajax异步请求时只需要为callback传入回调标识名称,即可实现Jsonp通信。假设传递的callback标识名称为datas,那么最终的Json数据格式如下代码所示。

Jsonp能够轻松地实现Ajax异步请求,关于Jsonp的实际应用,接来下将结合JavaScript进行简单介绍。