YII CJson类

CJson文档:

http://www.yiiframework.com/doc/api/1.1/CJSON

CJson::encode可以编码任何类型的数据:源码如下;

public static function encode($var)
{
    switch (gettype($var)) {
        case ‘boolean‘:
            return $var ? ‘true‘ : ‘false‘;

        case ‘NULL‘:
            return ‘null‘;

        case ‘integer‘:
            return (int) $var;

        case ‘double‘:
        case ‘float‘:
            return str_replace(‘,‘,‘.‘,(float)$var); // locale-independent representation

        case ‘string‘:
            if (($enc=strtoupper(Yii::app()->charset))!==‘UTF-8‘)
                $var=iconv($enc, ‘UTF-8‘, $var);

            if(function_exists(‘json_encode‘))
                return json_encode($var);

            // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
            $ascii = ‘‘;
            $strlen_var = strlen($var);

           /*
            * Iterate over every character in the string,
            * escaping with a slash or encoding to UTF-8 where necessary
            */
            for ($c = 0; $c < $strlen_var; ++$c) {

                $ord_var_c = ord($var{$c});

                switch (true) {
                    case $ord_var_c == 0x08:
                        $ascii .= ‘\b‘;
                        break;
                    case $ord_var_c == 0x09:
                        $ascii .= ‘\t‘;
                        break;
                    case $ord_var_c == 0x0A:
                        $ascii .= ‘\n‘;
                        break;
                    case $ord_var_c == 0x0C:
                        $ascii .= ‘\f‘;
                        break;
                    case $ord_var_c == 0x0D:
                        $ascii .= ‘\r‘;
                        break;

                    case $ord_var_c == 0x22:
                    case $ord_var_c == 0x2F:
                    case $ord_var_c == 0x5C:
                        // double quote, slash, slosh
                        $ascii .= ‘\\‘.$var{$c};
                        break;

                    case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
                        // characters U-00000000 - U-0000007F (same as ASCII)
                        $ascii .= $var{$c};
                        break;

                    case (($ord_var_c & 0xE0) == 0xC0):
                        // characters U-00000080 - U-000007FF, mask 110XXXXX
                        // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                        $char = pack(‘C*‘, $ord_var_c, ord($var{$c+1}));
                        $c+=1;
                        $utf16 =  self::utf8ToUTF16BE($char);
                        $ascii .= sprintf(‘\u%04s‘, bin2hex($utf16));
                        break;

                    case (($ord_var_c & 0xF0) == 0xE0):
                        // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                        // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                        $char = pack(‘C*‘, $ord_var_c,
                                     ord($var{$c+1}),
                                     ord($var{$c+2}));
                        $c+=2;
                        $utf16 = self::utf8ToUTF16BE($char);
                        $ascii .= sprintf(‘\u%04s‘, bin2hex($utf16));
                        break;

                    case (($ord_var_c & 0xF8) == 0xF0):
                        // characters U-00010000 - U-001FFFFF, mask 11110XXX
                        // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                        $char = pack(‘C*‘, $ord_var_c,
                                     ord($var{$c+1}),
                                     ord($var{$c+2}),
                                     ord($var{$c+3}));
                        $c+=3;
                        $utf16 = self::utf8ToUTF16BE($char);
                        $ascii .= sprintf(‘\u%04s‘, bin2hex($utf16));
                        break;

                    case (($ord_var_c & 0xFC) == 0xF8):
                        // characters U-00200000 - U-03FFFFFF, mask 111110XX
                        // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                        $char = pack(‘C*‘, $ord_var_c,
                                     ord($var{$c+1}),
                                     ord($var{$c+2}),
                                     ord($var{$c+3}),
                                     ord($var{$c+4}));
                        $c+=4;
                        $utf16 = self::utf8ToUTF16BE($char);
                        $ascii .= sprintf(‘\u%04s‘, bin2hex($utf16));
                        break;

                    case (($ord_var_c & 0xFE) == 0xFC):
                        // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                        // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                        $char = pack(‘C*‘, $ord_var_c,
                                     ord($var{$c+1}),
                                     ord($var{$c+2}),
                                     ord($var{$c+3}),
                                     ord($var{$c+4}),
                                     ord($var{$c+5}));
                        $c+=5;
                        $utf16 = self::utf8ToUTF16BE($char);
                        $ascii .= sprintf(‘\u%04s‘, bin2hex($utf16));
                        break;
                }
            }

            return ‘"‘.$ascii.‘"‘;

        case ‘array‘:
           /*
            * As per JSON spec if any array key is not an integer
            * we must treat the the whole array as an object. We
            * also try to catch a sparsely populated associative
            * array with numeric keys here because some JS engines
            * will create an array with empty indexes up to
            * max_index which can cause memory issues and because
            * the keys, which may be relevant, will be remapped
            * otherwise.
            *
            * As per the ECMA and JSON specification an object may
            * have any string as a property. Unfortunately due to
            * a hole in the ECMA specification if the key is a
            * ECMA reserved word or starts with a digit the
            * parameter is only accessible using ECMAScript‘s
            * bracket notation.
            */

            // treat as a JSON object
            if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
                return ‘{‘ .
                       join(‘,‘, array_map(array(‘CJSON‘, ‘nameValue‘),
                                           array_keys($var),
                                           array_values($var)))
                       . ‘}‘;
            }

            // treat it like a regular array
            return ‘[‘ . join(‘,‘, array_map(array(‘CJSON‘, ‘encode‘), $var)) . ‘]‘;

        case ‘object‘:
            if ($var instanceof Traversable)
            {
                $vars = array();
                foreach ($var as $k=>$v)
                    $vars[$k] = $v;
            }
            else
                $vars = get_object_vars($var);
            return ‘{‘ .
                   join(‘,‘, array_map(array(‘CJSON‘, ‘nameValue‘),
                                       array_keys($vars),
                                       array_values($vars)))
                   . ‘}‘;

        default:
            return ‘‘;
    }
}
 $item = Item::model()->findByPk($_GET[‘id‘]); 
CJSON::encode($item)。如果换成json_encode则错误,因为$item类型为CActiveRecord.我们可以$item->attributes;得到Returns all column attribute values.然后才可以使用json_encode。

转一篇文章:

近日在了解YII中的JSON操作方法,发现内置了好几种进行JSON对象和字符串,包括JS的JSON互通的方法,下面是三种方式的JSON解析:上代码

[php] view plaincopy

  1. CJSON::encode( $json );
  2. json_encode( $json );
  3. CJavaScript::jsonEncode( $json );
我们还是来看个例子吧!先上代码吧:

[php] view plaincopy

  1. $json = array (
  2. ‘item1‘ => array (
  3. ‘item11‘ => array (
  4. ‘n‘ => ‘chenling‘,
  5. ‘m‘ => ‘llll‘
  6. ),
  7. ‘sex‘ => ‘男‘,
  8. ‘age‘ => 25,
  9. ‘admin‘=>true
  10. ),
  11. ‘item2‘ => array (
  12. ‘item21‘ => ‘ling‘,
  13. ‘sex‘ => ‘女‘,
  14. ‘age‘ => ‘24‘,
  15. ‘admin‘=>false
  16. )
  17. );
这上面是个三个层级的数组,数组的值包括了字符串、boolean、和数字,我们通过上面的三种方式来输出看看结果是什么:

[php] view plaincopy

  1. $jsonObj = CJSON::encode( $json );
  2. $jsono = json_encode( $json );
  3. $jsonjs = CJavaScript::jsonEncode( $json );
  4. echo $jsonObj.‘<br />‘;
  5. echo $jsonjs.‘<br />‘;
  6. echo $jsono.‘<br />‘;
结果:

看来三种方式都可以,解析出来的也是一样的。如果要访问数组的值的话,用下面的 代码就行了。


  1. echo $json[‘item1‘][‘sex‘].‘<br />‘;

现在来看看转换成JSON对象的方法:


  1. $jsonstr=‘{"item1":{"item11":{"n":"chenling","m":"llll"},"sex":"男","age":"25"},"item2":{"item21":"ling","sex":"女","age":"24"}}‘;
  2. echo $jsonstr.‘<br />‘;


  1. //$j = CJSON::decode($jsonstr);
  2. //$j = CJavaScript::jsonDecode($jsonstr);
  3. <span style="color:#ff0000;"><strong>$j = json_decode($jsonstr,true);//当字符串为{"1":1,"2":1} 这种模式时,json_decode默认解析出来的结果是一个对象,此时可以设置它的第二个参数为true强制让它返回数组</strong></span>

上面两个方法转换都是没有问题的,关键是上面红色标注的就有问题了,如果我没有加后面的参数true的话,结果就是下面的报错信息,原因就是因为

当字符串为{"1":1,"2":1} 这种模式时,json_decode默认解析出来的结果是一个对象,此时可以设置它的第二个参数为true强制让它返回数组。

如果是下面的这个代码,则转换就没有问题

  1. $jsonstr = ‘[1,2,3]‘;
  2. $j = json_decode($jsonstr);//如果不加第二个参数的话,当字符串为[1,2,3] 这种模式时,json_decode默认解析出来的结果是一个数组
  3. echo $j[2].‘<br />‘;
所以这个是要注意的,同时我们可能遇到下面的这种情况的JSON字符串,这个也是要注意的!尤其是要注意转换完成后的数组访问方式
  1. $jsonstr=‘{"item1":[{"name":[{"chen":"chenling","ling":"chenli"}],"sex":"男","age":"25"},{"name":"sun","sex":"女","age":"24"}]}‘;
  2. $j = CJSON::decode($jsonstr);
  3. echo $j[‘item1‘][0][‘name‘][0][‘chen‘].‘<br />‘;
  4. <strong><span style="color:#ff0000;">$j = json_decode($jsonstr,true);</span></strong>
  5. echo $j[‘item1‘][0][‘name‘][0][‘chen‘].‘<br />‘;
  6. $j = CJavaScript::jsonDecode($jsonstr);
  7. echo $j[‘item1‘][0][‘name‘][0][‘chen‘].‘<br />‘;
这种情况也得注意,都是数组的情况下,只能通过索引进行访问,而不能通过key来访问。

 

  1. $jsonstr=‘[["item1","item11"],["n","chenling"],["m","llll"]]‘;
  2. $j = CJSON::decode($jsonstr);
  3. echo $j[1][1].‘<br />‘;
  4. $j = json_decode($jsonstr);
  5. echo $j[0][0].‘<br />‘;
  6. $j = CJavaScript::jsonDecode($jsonstr);
  7. echo $j[0][0].‘<br />‘;
也就是说在这三种的情况下:

CJSON和CJavaScript的方式是可以通用的,而json_的方式是需要第二个参数来决定的。所以为了兼容,我们还是尽量使用前两个进行JSON的转换操作;

转自:  http://blog.csdn.net/qq415734794/article/details/7662449

时间: 07-26

YII CJson类的相关文章

YII 邮件发送 phpmailer发送邮件!Yii自定义类引用

第一步:下载phpmailer解压后得到以下三个文件 class.phpmailer.php class.pop3.php class.smtp.php 将class.phpmailer.php改名成phpmailer.php并把三个文件放到 /protected/extensions/PHPMailer/目录下 修改一下phpmailer.php文件,添加init方法 public static function init(){ return new PHPMailer(); } 第二步:修改

第一章:认识Yii

第一章:认识Yii 认识Yii 在过去几年中,框架迅速发展,几乎在Web应用开发中,每个人都会涉及到一个新生框架,Web开发框架会帮助你加快你的应用程序发布,你只需迅速的把你的想法在框架的白板上书写功能代码.随着Web应用的实现具有共同特征,现有的框架方案已经满足这些要求,在今天还有什么理由要从头开始你的下一个Web应用呢?今天的Web开发,除程序自身语言外,一个现代化.灵活的和可扩展的框架,几乎是一个至关重要的编程工具,此外,如果语言与框架两个部份有特别的互补性,结果是将一个非常强大的工具包:

yii2源码学习笔记(三)

组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,如果需要事件和行为的功能,需要继承该类. yii\base\Component代码详解 <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base;

学习yii2.0框架阅读代码(十三)

组件(Component) 组件是 Yii 应用的主要基石.是 yii\base\Component 类或其子类的实例.三个用以区分它和其它类的主要功能有: 属性(Property) 事件(Event) 行为(Behavior) 或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用.以小部件 yii\jui\DatePicker 来举例,这是个方便你在 视图 中生成一个交互式日期选择器的 UI 组件: use yii\jui\DatePicker; echo DatePick

Yii2的深入学习--yii\base\Event 类

根据之前一篇文章,我们知道 Yii2 的事件分两类,一是类级别的事件,二是实例级别的事件.类级别的事件是基于 yii\base\Event 实现,实例级别的事件是基于 yii\base\Component 实现. 今天先来看下类级别事件的实现,代码是 yii\base\Event 类. <?php namespace yii\base; /** * Event is the base class for all event classes. */ class Event extends Obje

yii框架之gii创建数据表对应的model类

一.首先是在数据库中建立工程需要的表: 二.然后,配置对应文件: 在工程目录下yiiProject\protected\config\main.php.在50行定义了db应用组件,下面后一段注释掉了的mysql的链接配置项,我们将未注释的db注释掉,然后打开mysql链接代码并填写相关信息即可完成mysql链接配置项. 即,把下面代码         'db'=>array(             'connectionString' => 'sqlite:'.dirname(__FILE_

Yii的数组助手类

获取值 用原生PHP从一个对象.数组.或者包含这两者的一个复杂数据结构中获取数据是非常繁琐的. 你首先得使用isset 检查 key 是否存在, 然后如果存在你就获取它,如果不存在, 则提供一个默认返回值: Yii 提供了一个非常方便的方法来做这件事: 方法的第一个参数是我们从哪里获取值.第二个参数指定了如何获取数据, 它可以是下述几种类型中的一个: 数组键名或者欲从中取值的对象的属性名称: 以点号分割的数组键名或者对象属性名称组成的字符串,上例中使用的参数类型就是该类型: 返回一个值的回调函数

Yii2的深入学习--yii\base\Object 类

之前我们说过 Yii2 中大多数类都继承自 yii\base\Object,今天就让我们来看一下这个类. Object 是一个基础类,实现了属性的功能,其基本内容如下: <?php namespace yii\base; use Yii; /** * Object 是一个基础类,实现了属性的功能 * Yii最基础的类,大多数类都继承了该类 */ class Object implements Configurable { /** * 获取静态方法调用的类名.返回类的名称,如果不是在类中调用则返回

将php分页类与YII框架结合并根据需要改变样式

分页类http://blog.csdn.net/buyingfei8888/article/details/40260127 分页类放在组件里面 文件名称与保持一致 组件是在什么地方被加载进来的?在主配置文件里面 实现分页效果也是分为4步: 控制器: function actionShow1(){ $good_model = Goods::model(); $good_info = $good_model ->findAll(); //设置总数目和每页显示数量 $cnt = $good_mode