php json语法错误,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() 返回人类可读的消息,该消息是尝试对字符串进行编码/解码时发生的最后一个错误。即使没有发生错误,此函数也将始终返回字符串。

默认的非错误字符串是No Error

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());

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值