PHP开发笔记(二)PHP的json_encode和json_decode问题

解决PHP的json_encode问题之前,先了解一下PHP预定义常量http://php.net/manual/zh/json.constants.php。

用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式,如果想汉字不进行转码,可以升级PHP,在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode。

JSON_UNESCAPED_UNICODE //中文不转为unicode

JSON_UNESCAPED_SLASHES //不转义反斜杠

<?php echo json_encode("中文", JSON_UNESCAPED_UNICODE);

还有一种写法,就是下面使用整数来代替。

JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES 都是常量

JSON_UNESCAPED_UNICODE = 256

JSON_UNESCAPED_SLASHES = 64

JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES = 320

<?php $arr = array('test'=>'测试中文和/同时生效');

json_encode($arr,320);

如果使用两个变量,需要中间使用|,因为在PHP内部都是用1 << N这种方式定义的常量。如下所示:

json_encode($arr,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

【下面三点是转载的内容-_-】

1.把汉字先urlencode然后再使用json_encode,json_encode之后再次使用urldecode来解码,这样编码出来的json数组中的汉字就不会出现unicode编码了。

$array = array( 'test'=>urlencode("我是测试") ); $array = json_encode($array); echo urldecode($array); //{"test":"我是测试"}

2.对unicode码再进行解码,解码函数如下: function decodeUnicode($str) {     return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',         create_function(             '$matches',             'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'         ),         $str); }

3.例子

$arr = array('name1':"中文",'name2':'abc12'); 

$jsonstr = decodeUnicode(json_encode($arr));

json_decode相关问题总结

php在调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误: 代码如下:

Cannot use object of type stdClass as array

产生原因,代码如下:

$res = json_decode($res); 

$res['key']; //把 json_decode() 后的对象当作数组使用 。 

常见的解决方法有2种:

1、使用 json_decode($d, true)。就是使json_decode 的第二个变量设置为 true。

2、json_decode($res) 返回的是一个对象, 不可以使用 $res['key'] 进行访问, 换成 $res->key 就可以了。

posted on 2017-12-12 20:05  郑陆伟  阅读(1327)  评论(0编辑  收藏  举报

导航