zoukankan      html  css  js  c++  java
  • 【转】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

  • 相关阅读:
    使用South时候由于两个相同id的文件引起的问题
    Python os模块
    Ubuntu的关机重启命令知识
    [BUGFIX]__import_pywin32_system_module__
    Django生产环境的部署-Apache-mod_wsgi
    我是如何将linux用在开发环境中的
    php抽奖概率算法
    PHP接收IOS post过来的json数据无法解析的问题
    python apache下出现The _imaging C module is not installed
    php 打印
  • 原文地址:https://www.cnblogs.com/hongfei/p/2561312.html
Copyright © 2011-2022 走看看