关于YII中JSON的操作

近日在了解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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值