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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
解析php curl_setopt 函数的相关应用及介绍
Jun 17 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP时间处理类操作示例
Sep 05 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
php设计模式之策略模式应用案例详解
Jun 17 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
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
Javascript调用C#代码
2011/01/17 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
TensorFlow神经网络优化策略学习
2018/03/09 Python
python读取文本中的坐标方法
2018/10/14 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
安全员岗位职责
2013/11/11 职场文书
仲裁协议书
2014/09/26 职场文书
土地转让协议书
2014/09/27 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
综治维稳工作汇报
2014/10/27 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL