PHP 调试JSON错误
示例
当json_encode或json_decode无法解析提供的字符串时,它将返回false。当发生这种情况时,PHP本身不会引发任何错误或警告,用户有责任使用json_last_error()和json_last_error_msg()函数检查是否发生了错误,并在应用程序中采取相应措施(调试它,显示错误消息等)。
以下示例显示了使用JSON时的常见错误,即无法解码/编码JSON字符串(例如,由于传递了错误的UTF-8编码的字符串)。
//格式错误的JSON字符串 $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()返回人类可读的消息,该消息是尝试对字符串进行编码/解码时发生的最后一个错误。
即使没有发生错误,此函数也将始终返回字符串。
默认的非错误字符串是NoError
false如果发生其他错误(未知),它将返回
在循环中使用此代码时要小心,因为json_last_error_msg在每次迭代时都会被覆盖。
您仅应使用此功能来获取要显示的消息,而不要在控制语句中进行测试。
//不要这样做: if (json_last_error_msg()){} //始终为真(这是一个字符串) if (json_last_error_msg() != "No Error"){} //坏习惯 //执行以下操作:(针对预定义的常量之一测试整数) if (json_last_error() != JSON_ERROR_NONE) { //使用json_last_error_msg仅显示消息(不对其进行测试) printf("JSON Error: %s", json_last_error_msg()); }
PHP5.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提供的预定义常量之一。