先了解下Json(资料来自www.json.org):JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language(http://www.crockford.com/javascript), Standard ECMA-262 3rd Edition – December 1999(http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
以前在用Ajax的时候传输数据最多用的是text(html),偶尔也用用XML。但是在PHP文件中生成HTML是一件非常麻烦的事情,更不要说在HTML中添加各种效果了;用XML呢,虽然说这是当下比较流行的数据存储和传输格式,但是我们在后台也要生成一遍XML,在前台用DOM解析起来也非常之慢。听说又种叫Json的传输格式有愈加流行的趋势,它是JavaScript中内置的,无需解析,用起来速度非常快。而在最近学习的Zend Framework中有它的相关操作方法,我就决定试试来用它了。
在Zend Framework提供了Zend_Json::decode和Zend_Json::encode两个两个公共的static方法来操作Json数据。
Zend_Json::decode可以将获取到的Json数据转化为你所希望的数据类型,默认是数组,但是如果你希望它返回一个对象,可以用Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT)。
利用Zend_Json::encode可以轻松的将PHP中的Json字符串,类,数组等数据转化成JavaScript中能直接读取操作的Json数据,但要注意的是在Ajax和Json的传输过程中使用的是UTF-8编码,所有使用其它编码的数据必须转化成这个编码,否则在使用Zend_Json::encode时会出现汉字乱码或者是汉字字符串丢失的情况。由于我的项目用的是GB2312,封装的类返回的数据也全是GB2312编码的多维数组,而PHP的iconv函数只能操作字符串,又不可能改封装好的类,我水平不高,之想到了挨个循环数组进行编码转换。下面是我写的适用于三维数组的编码转换,估计三维以上的数组用到的机会也不多吧,呵呵。
<?php function arrayCoding($array,$input,$output){ if(is_array($array)){ foreach($array as $a=>$b){ if(is_array($b)){ foreach($b as $c=>$d){ if(is_array($d)){ foreach($d as $e=>$f){ if(is_array($f)){ foreach($f as $i=>$j){ $array[$a][$c][$e][$i] = iconv ($input,$output,$j); } }else{ $array[$a][$c][$e] = iconv($input,$output,$f); } } }else{ $array[$a][$c] = iconv($input,$output,$d); } } }else{ $array[$a] = iconv($input,$output,$b); } } }else{ $array = iconv($input,$output,$array); } return $array; } ?>
另外一个问题是我在用Zend_Json::decode的时候转换出的Json中是用双引号把数据括起来的,单是Js中只能用单引号括,不知道这是我操作不当还是它本身的问题,没办法我只能这样:
- $json = str_replace("\"","’",$json);
呵呵,没有想到的是str_replace居然对数组也起左右,我还以为只对字符串起作用呢。
至于Js那边读取就很简单了,例如我Ajax的CallBack的数据是:
var json=[{'fl_id':'1896','fl_subject':'\u7a0e\u52a1\u8db3\u7403\u961f', 'taglist':[{'tg_id':'2169','tg_name':'\u7a0e\u52a1\u8db3\u7403\u961f'}], ‘creater’:‘solo’,‘flvd’:‘s\/solo\/1896′}{‘fl_id’:’1897′, ‘fl_subject’:‘\u7a0e\u52a1\u8db3\u7403\u961f’, ‘taglist’:[{'tg_id':'2169','tg_name':'\u7a0e\u52a1\u8db3\u7403\u961f'}], ‘creater’:‘solo’,’flvd’:‘s\/solo\/1896′}]
如果我要取fl_subject’:'\u7a0e\u52a1\u8db3\u7403\u961f’,这一项里的值只需要用json[0].fl_subject就行了。
原文地址:http://www.powman.com/html/2007-08-30/talking-about-zend-learning-zend_json-data.html