【转】Zend_Json学习

先了解下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中只能用单引号括,不知道这是我操作不当还是它本身的问题,没办法我只能这样:

PHP代码
  1. $json = str_replace("\"","’",$json); 

 

呵呵,没有想到的是str_replace居然对数组也起左右,我还以为只对字符串起作用呢。

至于Js那边读取就很简单了,例如我Ajax的CallBack的数据是:

JavaScript代码
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

posted @ 2012-06-25 15:12  曾是土木人  阅读(1130)  评论(0编辑  收藏  举报