PHP中JSON的应用技巧


Posted in PHP onOctober 10, 2015

互联网的今天,AJAX已经不是什么陌生的词汇了。说起AJAX,可能会立即想起因RSS而兴起的XML。不可否认,XML是很不错的数据存储方式,但是其灵活恰恰造成了其解析的困难。当然,这里所指的困难,是相对于本文的主角--JSON而言。
JSON为何物?我就不重复概念了。通俗的说,它是一种数据的存储格式,就像PHP序列化后的字符串一样。它是一种数据描述。比如我们将一个数组序列化后存放,就可以很容易的反序列化后应用。JSON也是如此,只不过他搭建的是客户端Javascript和服务端PHP的交互桥梁。我们用PHP生成JSON后的字符串,然后把这个字符串传给前台Javascript,Javascirpt就可以很容易的将其反JSON然后应用。说通俗点,它真的很像数组。
言归正传,如何使用JSON。PHP5.2开始内置了JSON的支持。当然,如果低于这个版本的话,那么市面上有很多PHP版本的实现,随便下一个用就OK啦。现在主要是说说PHP内置支持的JSON。很简单,两个函数:json_encode和json_decode(跟序列化很像啦)。一个编码,一个解码。先看看编码的使用:

<?php  
$arr = array(  
  'name' => '陈毅鑫',  
  'nick' => '深空',  
  'contact' => array(  
    'email' => 'shenkong at qq dot com',  
    'website' => 'http://www.chinaz.com',  
  )  
);  
$json_string = json_encode($arr);  
echo $json_string;  
?>

很简单的将一个数组JSON了。需要指出的是,在非UTF-8编码下,中文字符将不可被encode,结果会出来空值,所以,如果你使用gb2312编写PHP代码,那么就需要将包含中文的内容使用iconv或者mb转为UTF-8再进行json_encode,上面输出结果如下:

{"name":"\u9648\u6bc5\u946b","nick":"\u6df1\u7a7a", 
"contact":{"email":"shenkong at qq dot com","website":"http:\/\/www.chinaz.com"}}

我都说了和序列化很像,你还不信。编码后就要解码,PHP提供了相应的函数json_decode,json_decode执行后,将会得到一个对象,操作如下:

<?php  
$arr = array(  
  'name' => '陈毅鑫',  
  'nick' => '深空',  
  'contact' => array(  
    'email' => 'shenkong at qq dot com',  
    'website' => 'http://www.chinaz.com',  
  )  
);  
$json_string = json_encode($arr);  
$obj = json_decode($json_string);  
print_r($obj);  
?>

访问对象内的属性会吧?$obj->name,这样子的,当然,也可以把它转位数组,方便调用啦:

$json_string = json_encode($arr);  
$obj = json_decode($json_string);  
$arr = array($obj);  
print_r($arr);

PHP转来转去的用途不是特别大,除了缓存生成,感觉还不如直接存数组呢,不过,当你和前台交互的时候,它的作用就出来咯,下面看看我怎么用Javascript来使用这段字符:

<script type="text/javascript"> 
var arr = {"name":"\u9648\u6bc5\u946b","nick":"\u6df1\u7a7a", 
"contact":{"email":"shenkong at qq dot com","website":"http:\/\/www.chinaz.com"}};  
alert(arr.name)  
</script>

上面中,直接将这个字符串赋给一个变量,它就变成一个Javascript数组了(专业化术语应该不叫数组,不过由于PHP的习惯问题,我就一直叫数组好了,方便理解)。这样,可以很方便的对arr进行遍历或者任意做你想做的事情了。写到这里,好像都没提到AJAX哦?是哦,联想一下,如果服务端返回的responseText用JSON过的字符串代替XML的话,前台Javascript处理起来是不是很方便呢?狗皮膏药就是这样用的。
其实写到这里,除了数据的存储格式不太一样外,JSON和XML也没什么太大区别哦,不过下面我说的一点。虽然和XML没多大关系,不过,可以说明JSON更大范围的应用,那就是,跨域的数据调用。由于安全性问题,AJAX不支持跨域调用,这样要调用不同域名下的数据,很麻烦哦,虽然有解决方案(stone在他的讲座上提到过了代理啊什么的虽然听不懂但是知道能解决)。我写两个文件,足以展示跨域调用了。
主调文件index.html

<script type="text/javascript">  
function getProfile(str) {  
  var arr = str;  
  document.getElementById('nick').innerHTML = arr.nick;  
}  
</script>  
<body><div id="nick"></div></body>  
<script type="text/javascript" src="http://www.openphp.cn/demo/profile.php"></script>

被调文件profile.php

<?php  
$arr = array(  
  'name' => '陈毅鑫',  
  'nick' => '深空',  
  'contact' => array(  
    'email' => 'shenkong at qq dot com',  
    'website' => 'http://www.chinaz.com',  
  )  
);  
$json_string = json_encode($arr);  
echo "getProfile($json_string)";  
?>

很显然,当index.html调用profile.php时,JSON字符串生成,并作为参数传入getProfile,然后将昵称插入到div中,这样一次跨域数据交互就完成了,是不是特别简单。

既然JSON这么简单易用而且好用,还等什么呢?希望这篇文章对大家的学习有所帮助。

PHP 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
第十一节--重载
Nov 16 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
preg_match_all使用心得分享
Jan 31 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
php发送邮件的问题详解
Jun 22 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
Oct 10 #PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 #PHP
php中删除、清空session的方式总结
Oct 09 #PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 #PHP
PHP中Closure类的使用方法及详解
Oct 09 #PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 #PHP
PHP程序员不应该忽略的3点
Oct 09 #PHP
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
YII框架http缓存操作示例
2019/04/29 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
Highcharts入门之简介
2016/08/02 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
详解vscode中vue代码颜色插件
2018/10/11 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
关于Python面向对象编程的知识点总结
2017/02/14 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
对python中的高效迭代器函数详解
2018/10/18 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
采购文员岗位职责
2013/11/20 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
同学会感言
2015/07/30 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python