<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
小试 PHP5.2 的JSON
作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
时间:2006-12-17
PHP 5.2 出来了,听说改进了很多,包括内存管理、速度等等都要比 PHP5.0、PHP5.1要快不少,而且有人测试过,比PHP 4.4.x 还要快,确实很值得升级,而且PHP是向下兼容的,同时还Fixed了200多个bug,并且增加了JSON、Filter、Zip、Date等功能。具体可以查看Ben写的文章。
今天我就小试了一下PHP 5.2 内置了JSON功能,JSON主要是用于Ajax里面的远程访问时候的数据交换格式,可以说是用来在Ajax中取代XML格式的一个轻量级数据交换格式,潜力不容小瞧,因为Google Maps就是抛弃XML而使用JSON的典型例子。
想了解JSON,可以查看这里查看更多文章,同时想了解关于格式定义可以参考JSON官方网站,关于更多JSON的资料请Google。
一、使用JSON
查看新版的PHP手册中JSON函数一节,JSON就增加了两个API,json_decode(),对一个json字符串进行解码,json_encode()是生成一个json字符串,我们就简单的测试一下。
构建如下PHP代码:
php
//对象
classJsonTest{
var$id=1;
var$name='heiyeluren';
var$gender='男';
}
$obj=newJsonTest;
echojson_encode($obj)."
";
//数字索引数组
$arr1=array(1,'heiyeluren','男');
echojson_encode($arr1)."
";
//关联索引数组
$arr2=array("id"=>1,"name"=>'heiyeluren',"gender"=>'男');
echojson_encode($arr2)."
";
//多维数字索引数组
$arr3=array(array(1,'heiyeluren','男'),array(1,'heiyeluren','男'));
echojson_encode($arr3)."
";
//关联索引数组
$arr4=array(array("id"=>1,"name"=>'heiyeluren',"gender"=>'男'),array("id"=>1,"name"=>'heiyeluren',"gender"=>'男'));
echojson_encode($arr4)."
";
?>
浏览器输出:
{"id":1,"name":"heiyeluren","gender":""}
[1,"heiyeluren",""]
{"id":1,"name":"heiyeluren","gender":""}
[[1,"heiyeluren",""],[1,"heiyeluren",""]]
[{"id":1,"name":"heiyeluren","gender":""},{"id":1,"name":"heiyeluren","gender":""}]
按照JSON格式定义,我们可以发现上面的几个特点:
1. 纯的数字索引是按照JavaScript能够识别的数组来存储的
2. 关联索引数组是按照JavaScript对象的形式来构造的
3. 多维关联索引是按照外围是JavaScript数组,中间的索引数组是对象
4. 无法识别中文,所有的中文字符串显示为空
现在构造一个JavaScript的解析访问看看:
scriptlanguage="javascript">
s1='{"id":1,"name":"heiyeluren","gender":""}';
s2='[1,"heiyeluren",""]';
s3='[{"id":1,"name":"heiyeluren","gender":""},{"id":1,"name":"heiyeluren","gender":""}]';
eval("a1="+s1);
eval("a2="+s2);
eval("a3="+s3);
alert(a1);
alert(a2);
alert(a3);
script>
我们看alert输出:
[objectObject]
1,heiyeluren,
[objectObject],[objectObject]
二、JSON中文问题的处理
基本就是比较简单的测试了,至于其他数据类型,像整形、字符串等太简单没有测试的必要。现在我们来考虑一下PHP的JSON扩展无法处理中文的问题,我们基本的解决方案就是在服务器端转化前对中文进行转码,比如转成URL编码或者进行进制转换,然后客户端进行相应的转换。
1. URL 编码方式
php自带了 urlencode() 和 urldecode() 函数,用于URL编码的转换,但是JavaScript客户端没有,所以构造两个JavaScript的转码函数。(以下代码只适合IE浏览器和GBK/GB2312编码)
Scriptlanguage="VBScript">
/*VBscript构建字符串变成ASC码*/
Functionstr2asc(strstr)
str2asc=hex(asc(strstr))
EndFunction
/*VBscript构建ASC变成字符串码*/
Functionasc2str(ascasc)
asc2str=chr(ascasc)
EndFunction
script>
ScriptLanguage="JavaScript">
/*URLEncode*/
functionurlencode(str){
varret="";
varstrSpecial="!"#$%&'()*+,/:;?[]^`{|}~%";
for(vari=0;i<str.length></str.length>varchr=str.charAt(i);
varc=str2asc(chr);
tt+=chr+":"+c+"n";
if(parseInt("0x"+c)>0x7f){
ret+="%"+c.slice(0,2)+"%"+c.slice(-2);
}else{
if(chr=="")
ret+="+";
elseif(strSpecial.indexOf(chr)!=-1)
ret+="%"+c.toString(16);
else
ret+=chr;
}
}
returnret;
}
/*URLDecode*/
functionurldecode(str){
varret="";
for(vari=0;i<str.length></str.length>varchr=str.charAt(i);
if(chr=="+"){
ret+="";
}elseif(chr=="%"){
varasc=str.substring(i+1,i+3);
if(parseInt("0x"+asc)>0x7f){
ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6)));
i+=5;
}else{
ret+=asc2str(parseInt("0x"+asc));
i+=2;
}
}else{
ret+=chr;
}
}
returnret;
}
2. 进制转换的方式
PHP有 bin2hex() 函数用于把二进制转换成16进制,但是确没有把16进制转换成2进制的函数,我们简单把两个函数都构造一下:
php
//2进制到16进制(PHP已经自带,本程序只是演示)
functionbin2hex($str){
$arr=unpack("H*",$str);
return$arr[1];
}
//16进制到2进制
functionhex2bin($str){
returnpack("H*",$str);
}
?>
客户端的JavaScript两个函数都没有,我们只能够自己构造。(以下函数只适合IE浏览器和UTF8编码)
ScriptLanguage="JavaScript">
//二进制转换为16进制
functionbin2hex(bin){
varresult="";
vartemp="";
for(vari=0;ibin.length;i++){
varchr=bin.charCodeAt(i);
if(chr>127){
chr=encodeURIComponent(bin.charAt(i));
}else{
chr=chr.toString(16);
}
result+=chr;
}
for(vari=0;iresult.length;i++){
varchr=result.charAt(i);
if(chr!='%'){
temp+=chr;
}
}
returntemp.toLowerCase();
}
//16进制转换为2进制
functionhex2bin(hex){
varresult="";
if(hex.length&&hex.length%2==0){
for(vari=0;ihex.length;i+=2){
result+="%";
result+=hex.substr(i,2);
}
result=decodeURIComponent(result);
}
returnresult;
}
Script>
总的来说,这些左转右转编码的方式效率都不会很高,特别是处理的字符串很多的时候,效率不敢恭维,我们还是需要寻找更快速的方式,或者最好是PHP的JSON扩展能够直接支持中文,那就最好了。
三、结束语
看了这么简单有趣的功能,那么还不赶紧把你的PHP版本升级到5.2,并且尝试使用Ajax来构建你的系统,另外,抛弃恶心可恶麻烦的XML,来拥抱我们快速简洁的JSON吧,你一定会获得惊喜的。
相关推荐
通达信指标公式源码 小试牛刀精髓.doc
通达信指标公式源码小试牛刀.doc
牛刀小试 VC++教程高清PDF版.pdf
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
第5季-小试牛刀-项目开发
牛刀小试C语言基础教学及实践,适合初学者学习。
1. 想象今天你是户外用品的电商,主要销售到美国,你刚建好网站并希望可以增 2. 为什么谷歌分析工具(Google Analytics)跟谷歌广告平台(Goog
暴雪作业(修改,小试牛刀,大家给点意见[配有音乐)
小试牛刀.exe
学汇编最好的入门教程!更浅显,更易懂!从实践出发!
ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)
各位同学,此篇文档有助于刚接触Docker学员,请根据文档进行实战一下,有助于加深对Docker的理解
大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料 大名鼎鼎得0ginr牛刀小试 教你VC 珍藏资料
刘易斯小试牛刀.nrp
NULL 博文链接:https://liwenshui322.iteye.com/blog/479782
PLSQL练习(小试牛刀)
用义隆单片机当中的3个IO口做INPUT,3个口做OUTPUT.然后P65 P64外部接有上拉电阻,P63外部下拉。用P65和P64当做RS触发器的S R端,将RS触发器输出的结果再和P63的状体相与,定义结果为L1,如果L1为1,则R61输出高电平...
解密问题课堂小试.sln
scratch2源码动画小试本资源系百度网盘分享地址
2--[动画小试].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[动画小试].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[动画小试].zip源码scratch2.0 3.0编程项目源文件源码案例素材源...