关于YII中JSON的操作

来源:互联网 发布:identifier c语言 编辑:程序博客网 时间:2024/06/16 20:21

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

CJSON::encode( $json );json_encode( $json );CJavaScript::jsonEncode( $json );

我们还是来看个例子吧!先上代码吧:

$json = array ('item1' => array ('item11' => array ('n' => 'chenling','m' => 'llll' ),'sex' => '男','age' => 25,'admin'=>true ),'item2' => array ('item21' => 'ling','sex' => '女','age' => '24','admin'=>false ) );

这上面是个三个层级的数组,数组的值包括了字符串、boolean、和数字,我们通过上面的三种方式来输出看看结果是什么:

$jsonObj = CJSON::encode( $json );$jsono = json_encode( $json );$jsonjs = CJavaScript::jsonEncode( $json );echo $jsonObj.'<br />';echo $jsonjs.'<br />';echo $jsono.'<br />';

结果:

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

echo $json['item1']['sex'].'<br />';
现在来看看转换成JSON对象的方法:

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

//$j = CJSON::decode($jsonstr);//$j = CJavaScript::jsonDecode($jsonstr);<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强制让它返回数组。


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

$jsonstr = '[1,2,3]';$j = json_decode($jsonstr);//如果不加第二个参数的话,当字符串为[1,2,3] 这种模式时,json_decode默认解析出来的结果是一个数组echo $j[2].'<br />';

所以这个是要注意的,同时我们可能遇到下面的这种情况的JSON字符串,这个也是要注意的!尤其是要注意转换完成后的数组访问方式
$jsonstr='{"item1":[{"name":[{"chen":"chenling","ling":"chenli"}],"sex":"男","age":"25"},{"name":"sun","sex":"女","age":"24"}]}';$j = CJSON::decode($jsonstr);echo $j['item1'][0]['name'][0]['chen'].'<br />';<strong><span style="color:#ff0000;">$j = json_decode($jsonstr,true);</span></strong>echo $j['item1'][0]['name'][0]['chen'].'<br />';$j = CJavaScript::jsonDecode($jsonstr);echo $j['item1'][0]['name'][0]['chen'].'<br />';

这种情况也得注意,都是数组的情况下,只能通过索引进行访问,而不能通过key来访问。

$jsonstr='[["item1","item11"],["n","chenling"],["m","llll"]]';$j = CJSON::decode($jsonstr);echo $j[1][1].'<br />';$j = json_decode($jsonstr);echo $j[0][0].'<br />';$j = CJavaScript::jsonDecode($jsonstr);echo $j[0][0].'<br />';

也就是说在这三种的情况下:

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


转载请注明:  http://blog.csdn.net/qq415734794/article/details/7662449


0 0