json_decode這個函數是json_encode的反函數,一般傳遞數據的時候為了壓縮數據,會將數組格式的數據轉換成json格式,用到的函數就是json_encode,然后接收到數據之后再用json_decode轉換回數組;
json_decode($json)之后可能出現返回空,null等結果,這個時候一般都是json格式出問題, 可以用json_last_error()來檢查,json_last_error()函數的使用方式就是在json_decode之后添加這個函數, 函數會返回值,返回0說明格式沒錯, 若返回4,說明格式錯誤。
折磨了好幾個小時,終於找到了解決辦法,現在記錄如下:
第一種:
json_encode()中文在gbk/gb2312中對中文返回為null,而json_decode()函數只支持UTF-8與ASCII編碼,如果是gkb就會出問題;
解決辦法:
第一種:
/**
* UTF-8編碼 GBK編碼相互轉換/(支持數組)
* @param array $str 字符串,支持數組傳遞
* @return array
*/
function array_iconv( $str ){
if(is_array( $str )) {
foreach( $str as $k => $v ) {
$str[$k] = array_iconv( $v );
}
return $str;
} else {
if(is_string( $str )) {
return iconv( 'GBK//IGNORE', 'UTF-8', $str );
}else {
return $str;
}
}
}
echo json_encode(icon_to_utf8($str));
第二種:bom頭導致的bug,bom頭的產生應該是你的文件在windows下用記事本這些東西編輯過之后的后果。 因為bom頭是看不見的, 所以轉換的時候前面多了三個字節,
解決辦法:可用$json = substr ( $json, 3 );去掉頭部的三個字節, 轉換之后ok了。
最后再介紹一種,原因是
(1)$str只能UTF-8編碼
(2)元素最后不能有逗號(與php的array不同)
(3)元素不能使用單引號
(4)元素值中間不能有空格和n,必須替換
解決方法:
$data = stripslashes(html_entity_decode($info)); //$info是傳遞過來的json字符串 $data = json_decode($data,TRUE); //這時候$data就是解析后的數組了! //html_entity_decode() 函數的作用是把 HTML 實體轉換為字符。 //stripslashes() 函數的作用是刪除反斜杠。
以上幾種,絕對有一種可以解決問題。我是在微信開發中遇到的,調試很尷尬,打印老半天總算解決了。真是個慘痛的教訓。。。。。。。。。
