其实json编码解码应该是一件很简单的事情,提供的类或库函数用起来也就是encode、decode,似乎不是一件很复杂的事情;但随着json的 使用的越来越多,还真就发现了一些不能不去注意的问题。
1. 含有自引用属性的类的encode和decode
在js中, {"me":this} 是一个合法的对象,但是PHP对该对象做decode时,结果是: NULL
在PHP中:<?php
class test {
public $a;
// 注意: 不能直接写为:
// public $a = $this;
public function __construct() {
$this->a = $this;
}
}
?>
test是一个合法的类,但是PHP对该对象做encode时,结果:
Warning: json_encode(): recursion detected in E:\home\desktop\test.php on line 26
{"a":{"a":null}}
2. 单引号的问题, key、value最好使用双引号来引$obj = json_decode('{"me":"this"}'); // 属性和值都是用双引号
var_dump($obj);
结果:
object(stdClass)#2 (1) {
["me"]=>
string(4) "this"
}
$obj = json_decode("{'a':'this'}"); // 属性和值都是用单引号
var_dump($obj);
结果: NULL
使用Services_JSON
倒是没有问题的$json = new Services_JSON();
var_dump($json->decode("{'a':'this'}"));
exit;
输出:
object(stdClass)#2 (1) {
["a"]=>
string(4) "this"
}
3. 特殊字符的转移问题
对于双引号、斜线、反斜线是需要转义的
今天重新了解了json这个东西,仔细解读了: http://json.org/ ,特别是里面的图的理解。