调试 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 |
给出了无法编码的类型的值 |