json_last_error

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

json_last_error返回最后发生的错误

说明

json_last_error(): int

没有指定 JSON_THROW_ON_ERROR时,返回上一次 JSON 编码解码时发生的最后一个错误(如果有)。

参数

此函数没有参数。

返回值

返回一个整型(integer),这个值会是以下的常量之一:

JSON 错误码
常量 含义 可用性
JSON_ERROR_NONE 没有错误发生  
JSON_ERROR_DEPTH 到达了最大堆栈深度  
JSON_ERROR_STATE_MISMATCH 无效或异常的 JSON  
JSON_ERROR_CTRL_CHAR 控制字符错误,可能是编码不对  
JSON_ERROR_SYNTAX 语法错误  
JSON_ERROR_UTF8 异常的 UTF-8 字符,也许是因为不正确的编码。  
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded  
JSON_ERROR_INF_OR_NAN One or more NAN or INF values in the value to be encoded  
JSON_ERROR_UNSUPPORTED_TYPE 指定的类型,值无法编码。  
JSON_ERROR_INVALID_PROPERTY_NAME 指定的属性名无法编码。  
JSON_ERROR_UTF16 畸形的 UTF-16 字符,可能因为字符编码不正确。  

示例

示例 #1 json_last_error() 例子

<?php
// 一个有效的 json 字符串
$json[] = '{"Organization": "PHP Documentation Team"}';

// 一个无效的 json 字符串会导致一个语法错误,在这个例子里我们使用 ' 代替了 " 作为引号
$json[] = "{'Organization': 'PHP Documentation Team'}";


foreach (
$json as $string) {
echo
'Decoding: ' . $string;
json_decode($string);

switch (
json_last_error()) {
case
JSON_ERROR_NONE:
echo
' - No errors';
break;
case
JSON_ERROR_DEPTH:
echo
' - Maximum stack depth exceeded';
break;
case
JSON_ERROR_STATE_MISMATCH:
echo
' - Underflow or the modes mismatch';
break;
case
JSON_ERROR_CTRL_CHAR:
echo
' - Unexpected control character found';
break;
case
JSON_ERROR_SYNTAX:
echo
' - Syntax error, malformed JSON';
break;
case
JSON_ERROR_UTF8:
echo
' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo
' - Unknown error';
break;
}

echo
PHP_EOL;
}
?>

以上示例会输出:

Decoding: {"Organization": "PHP Documentation Team"} - No errors
Decoding: {'Organization': 'PHP Documentation Team'} - Syntax error, malformed JSON

示例 #2 json_encode()json_last_error()

<?php
// 无效的 UTF8 序列
$text = "\xB1\x31";

$json = json_encode($text);
$error = json_last_error();

var_dump($json, $error === JSON_ERROR_UTF8);
?>

以上示例会输出:

string(4) "null"
bool(true)

示例 #3 json_last_error()JSON_THROW_ON_ERROR

<?php
// 导致 JSON_ERROR_UTF8 的无效 UTF8 序列
json_encode("\xB1\x31");

// 以下不会导致 JSON 错误
json_encode('okay', JSON_THROW_ON_ERROR);

// 前者的 json_encode() 不会改变全局错误状态
var_dump(json_last_error() === JSON_ERROR_UTF8);
?>

以上示例会输出:

bool(true)

参见