除錯 JSON 錯誤
當 json_encode
或 json_decode
無法解析提供的字串時,它將返回 false
。當發生這種情況時,PHP 本身不會引發任何錯誤或警告,使用者有責任使用 json_last_error()
和 json_last_error_msg()
函式來檢查是否發生了錯誤並在應用程式中相應地執行操作(除錯它,顯示錯誤訊息)等)。
以下示例顯示了使用 JSON 時的常見錯誤,無法解碼/編碼 JSON 字串 (例如,由於傳遞了錯誤的 UTF-8 編碼字串) 。
// An incorrectly formed JSON string
$jsonString = json_encode("{'Bad JSON':\xB1\x31}");
if (json_last_error() != JSON_ERROR_NONE) {
printf("JSON Error: %s", json_last_error_msg());
}
#> JSON Error: Malformed UTF-8 characters, possibly incorrectly encoded
json_last_error_msg
json_last_error_msg()
返回嘗試編碼/解碼字串時發生的最後一個錯誤的人類可讀訊息。
- 即使沒有發生錯誤,此函式也將始終返回一個字串。
預設的非錯誤字串是No Error
- 如果發生其他(未知)錯誤,它將返回
false
- 在迴圈中使用它時要小心,因為在每次迭代時都會覆蓋 json_last_error_msg 。
你應該只使用此函式來獲取要顯示的訊息,而不是在控制語句中進行測試。
// Don't do this:
if (json_last_error_msg()){} // always true (it's a string)
if (json_last_error_msg() != "No Error"){} // Bad practice
// Do this: (test the integer against one of the pre-defined constants)
if (json_last_error() != JSON_ERROR_NONE) {
// Use json_last_error_msg to display the message only, (not test against it)
printf("JSON Error: %s", json_last_error_msg());
}
PHP 5.5 之前不存在此函式。這是一個 polyfill 實現:
if (!function_exists('json_last_error_msg')) {
function json_last_error_msg() {
static $ERRORS = array(
JSON_ERROR_NONE => 'No error',
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
$error = json_last_error();
return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
}
}
json_last_error
json_last_error()
返回一個對映到 PHP 提供的預定義常量之一的整數。
不變 | 含義 |
---|---|
JSON_ERROR_NONE |
沒有發生錯誤 |
JSON_ERROR_DEPTH |
已超出最大堆疊深度 |
JSON_ERROR_STATE_MISMATCH |
JSON 無效或格式錯誤 |
JSON_ERROR_CTRL_CHAR |
控制字元錯誤,可能編碼錯誤 |
JSON_ERROR_SYNTAX |
語法錯誤 (自 PHP 5.3.3 起) |
JSON_ERROR_UTF8 |
格式錯誤的 UTF-8 字元,可能編碼錯誤 (自 PHP 5.5.0 起) |
JSON_ERROR_RECURSION |
要編碼的值中的一個或多個遞迴引用 |
JSON_ERROR_INF_OR_NAN |
要編碼的值中的一個或多個 NAN 或 INF 值 |
JSON_ERROR_UNSUPPORTED_TYPE |
給出了無法編碼的型別的值 |