发新话题
打印

陈泽|SurfChen Zend Framework中的JSON解释器

陈泽|SurfChen Zend Framework中的JSON解释器

摘录地址:http://www.surfchen.org/?p=189

JSON是一种数据格式,全称为Javascript Object Notation。在Javascript,这个格式的数据可以很容易的转换为类的格式。

例如:
复制内容到剪贴板
代码:
<script type="text/javascript">
json = '{"name" : "SurfChen",     "skill": ["PHP","Javascript"]}';
the_obj = eval("("+json+")");
//上面两行等同于the_obj = {"name" : "SurfChen",     "skill": ["PHP","Javascript"]},注意引号的数量
</script>
这时候
复制内容到剪贴板
代码:
the_obj.name == ‘SurfChen’;
the_obj.skill[0] == ‘PHP’;
the_obj.skill[1] == ‘Javascript’;
而在几个月前发布的Zend Framework里,包含了一个叫Zend_Json的库,它可以让我们在PHP里很方便的把对象/数组的数据转换为JSON格式,或者把JSON格式转换为对象/数组的格式。

例1,JSON转换成对象
复制内容到剪贴板
代码:
require_once("Json.php");
$json='{"name" : "SurfChen",     "skill": ["PHP","Javascript"]}';
print_r(Zend_Json::decode($json,Zend_Json::TYPE_OBJECT));
输出:
stdClass Object ( [name] => SurfChen [skill] => Array ( [0] => PHP [1] => Javascript ) )

例2,JSON转换成数组
复制内容到剪贴板
代码:
require_once("Json.php");
$json='{"name" : "SurfChen",     "skill": ["PHP","Javascript"]}';
print_r(Zend_Json::decode($json,Zend_Json::TYPE_ARRAY));
输出:Array ( [name] => SurfChen [skill] => Array ( [0] => PHP [1] => Javascript ) )

例3,对象转换成JSON
复制内容到剪贴板
代码:
require_once("Json.php");
class person
{
      public $name    = 'surfchen';
      public $skill = array('php','javascript');
}
$surfchen=new person;
echo Zend_Json::encode($surfchen);
输出:{”__className”: “person”, “name” : “surfchen”, “skill” : [”php”, “javascript”]}

需要注意的是,PHP里,JSON里的键名和值,都必须以双引号括起来,而JS里,双引号和单引号皆可。

TOP

JSON 确实好用.  我说下在项目中用到 JSON 的经验.  PHP 自带的 json_decode 函数对中文支持不是很好. 是把数组/对象(stdClass)转换成 json 格式时, 存在中文乱码问题.  原因在于 /zend/Json.php 中.
复制内容到剪贴板
代码:
    public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY)
    {
        if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) {
            return json_decode($encodedValue, $objectDecodeType);
        }

        require_once 'Zend/Json/Decoder.php';
        return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType);
    }
    public static function encode($valueToEncode, $cycleCheck = false)
    {
        if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) {
            return json_encode($valueToEncode);
        }

        require_once 'Zend/Json/Encoder.php';
        return Zend_Json_Encoder::encode($valueToEncode, $cycleCheck);
    }
我是直接把 function_exists('json_encode') 和 function_exists('json_decode') 注释掉.  这样就没有乱码的问题了.
管理者务必保证团队能够专心于既定目标而不受外界干扰。

TOP

发新话题