① php解析不了JSON
$keys = '{result:0,events:[{event:6}]}'; $string = json_decode($key...
答:json_decode( ) 可以實現對JSON格式的字元串進行編碼 你的Json字元串有問題 結果:array(2) { ["result"] => int(0) ["events"] => array(1) { [0] => array(1) { ["event"] => int(6) } }}
② PHP json_decode(); 為什麼沒輸出
我們知道網路api並不是百分百可靠,當遇到網路不穩定,介面出錯等各種因素,並不一定返回標準的json數據,例如:
//如果從網路api抓取失敗,返回的response為錯誤信息
$response='requesttimeout';
//json_decode之後返回NULL,你列印之後仍然沒有輸出,所以你採納的那個答案仍然也幫不到你
print_r(json_decode($response,true));
//使用var_mp列印雖然可以看到NULL值,可是這並沒有任何用處
var_mp(json_decode($response,true));
系統函數json_decode()在解析非json字元串返回NULL,解析亂碼的json也返回NULL,你壓根都不知道到底是哪裡出了問題,因為NULL該返回值是不能通過print_r列印出來的,而官方php手冊給了一些捕獲異常信息的方法已經封裝在下面的函數中了:
<?php
/**
*json解析介面,優化json_decode對數組的解析
*@paramstring$json_codejson字元串
*@returnmix錯誤信息或者數組
*/
function_json_decode($json_code)
{
$json_arr=json_decode($json_code,true);
switch(json_last_error()){
caseJSON_ERROR_NONE:
$error='';
break;
caseJSON_ERROR_DEPTH:
$error='-Maximumstackdepthexceeded';
break;
caseJSON_ERROR_STATE_MISMATCH:
$error='-Underfloworthemodesmismatch';
break;
caseJSON_ERROR_CTRL_CHAR:
$error='-';
break;
caseJSON_ERROR_SYNTAX:
$error='-Syntaxerror,malformedJSON';
break;
caseJSON_ERROR_UTF8:
$error='-MalformedUTF-8characters,possiblyincorrectlyencoded';
break;
default:
$error='-Unknownerror';
break;
}
if($error)
{
return$error.':'.$json_code;
}else{
return$json_arr;
}
}
header('Content-type:text/html;charset=utf-8');
$json='thisisnotajsoncode';
$arr=_json_decode($json);
if(is_array($arr))
{
//解析正確,邏輯代碼部分
print_r($arr);
}else{
//請求超時,一般都會有異常處理機制,例如重新發起請求
if($result=='requesttimeout'){
//發起請求
}else{
//如果沒有異常處理機制,拋出異常給上一層處理
thrownewException($result);
}
}
使用_json_decode的返回值如果是字元串,說明在解析json數據時遇到了錯誤,只要添加適當處理機制,可以大大提高代碼的穩固性。
如果返回值是數組,這時便可以使用print_r列印出來。
③ php json解析 出現問題 Notice: Trying to get property of non-object in。。。
php json解析 出現問題 Notice: Trying to get property of non-object in是設置錯誤造成的,解決方法為:
1、以快遞100介面為例,返回的JSON數據。
④ 關於PHP返回JSON的問題。
json 是一個標准來的...不用修改也不能修改
它要求你以:
* {
* "rows" : [{},{}], //數據集合
* "results" : 100, //記錄總數
* "hasError" : false, //是否存在錯誤
* "error" : "" // 僅在 hasError : true 時使用
* }
意思是以一個對象的形式返回...對象內容包括一個數據rows,包括一個結果總數result...等..你在PHP中,直接寫成類就可以了...
例子如下:
<?php
$obj=newstdclass();
$arr=array(1,1,1,1,1);
$obj->arr=$arr;
$obj->results=100;
$obj->hasError='false';
$obj->error='';
echojson_encode($obj);
?>
⑤ php怎麼接收json類型數據
PHP接收JSON格式的數據
在API服務中,目前流行採用json形式來交互。
給前端調用的介面輸出Json數據,這個比較簡單,只需要組織好數據,用json_encode($array) 轉化一下,前端就得到json格式的數據。
接收前端提交的json數據稍微復雜一點,原因是:PHP默認識別的數據類型是application/x-www.form-urlencoded標準的數據類型。因此,對型如text/xml 或者 soap 或者 application/octet-stream 和application/json格式之類的內容無法解析,如果用$_POST數組來接收就會失敗!
此時可以使用$GLOBALS['HTTP_RAW_POST_DATA'] 或 file_get_contents('php://input') 來獲取提交的數據
查看手冊,可以發現$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST的區別:
$_POST:通過 HTTP POST 方法傳遞的變數組成的數組,是自動全局變數。
$GLOBALS['HTTP_RAW_POST_DATA'] :總是產生 $HTTP_RAW_POST_DATA 變數包含有原始的 POST 數據。此變數僅在碰到未識別 MIME 類型的數據時產生。$HTTP_RAW_POST_DATA 對於 enctype="multipart/form-data" 表單數據不可用。也就是說基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一樣的。但是如果post過來的數據不是PHP能夠識別的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']來接收,比如 text/xml 或者 soap 等等。
補充說明:PHP默認識別的數據類型是application/x-www.form-urlencoded標準的數據類型。
⑥ php怎麼解析utf-8帶BOM編碼的json數據,php解析json數據返回NULL
son_decode函數能夠接收utf8編碼的參數,但是當參數中包含BOM時,json_decode就會失效。
這個函數能將給定的字元串轉換成UTF-8編碼,移除其中的BOM。
下面是PHP代碼:
function prepareJSON($input) {
//This will convert ASCII/ISO-8859-1 to UTF-8.
//Be careful with the third parameter (encoding detect list), because
//if set wrong, some input encodings will get garbled (including UTF-8!)
$imput = mb_convert_encoding($input, 'UTF-8', 'ASCII,UTF-8,ISO-8859-1');
//Remove UTF-8 BOM if present, json_decode() does not like it.
if(substr($input, 0, 3) == pack("CCC", 0xEF,
⑦ 如何修復錯誤格式的JSON在PHP
用json_encode()函數對數組進行JSON編碼。
<?php
$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echojson_encode($arr);
?>
以上常式會輸出:
{"a":1,"b":2,"c":3,"d":4,"e":5}[1]
當有中文字元時,當直接使用json_encode()函數會使漢字不能正常顯示。所以有了這個適用性比較廣的函數ch_json_encode()來解決這個問題。