PHP 使用 json_decode() 來解開 json, json 有資料, 但是卻傳回 NULL, 要如何 Debug 呢?
PHP json_decode() 傳回 NULL 的解法
PHP 使用 json_decode() 解開 json, 回傳 null, 於是先來看看 json 有什麼錯誤訊息.
註: 確定 json 格式是正確的.
可以使用此 Function json_last_error() 來看 json_decode() 到底發生什麼事情.
但是 json_last_error() 出來的值是數字, 無法直接對照看出錯誤訊息, 於此頁找到 PHP: json_last_error_msg 此 Function 直接取用.(PHP 5.5以上可直接使用, 不需要下述 Function)
<?php function json_last_error_msg() { static $errors = array( JSON_ERROR_NONE => null, JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch', JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded' ); $error = json_last_error(); return array_key_exists($error, $errors) ? $errors[$error] : "Unknown error ({$error})"; } ?>
範例
<?php var_dump(json_decode($json_data)); // null echo json_last_error() . "\n"; // 4 echo json_last_error_msg() . "\n"; // Syntax error, malformed JSON ?>
由上述得之, 錯誤訊息是 "Syntax error, malformed JSON", 問題是那格式是正確的, 後來想到因為 API 是 aspx、ashx, 可能會有 BOM(回傳有中文), 於是使用此篇 "PHP 判斷/移除 BOM(UTF-8)" 得 Function 先將 $json_data 過濾一次, 再來解開就可以動了.