常用知识 - json_encode的失败

  • 作者:KK

  • 发表日期:2016.9.15


如果按照一般的情况写代码,json_encode还是会执行失败,相信很多新手都可能意想不到或者没接触过.

当然如果传一个非数组进去叫人家encode这样的代码相信大家平时几乎不会写出来,所以只要传了数组进去却还是会encode失败那是为什么呢?

最典型的就是字符编码


重现这种错误

  1. 将文件编码设置成非UTF-8

  2. 文件编写如下代码:

    $user = ['name' => '小明'];
    echo json_encode($user);
    

然后就会看到空的输出,而不是预想中的{"name":"\u5c0f\u660e"}

其实是因为数组中含有非 UTF-8 的字符造成的,json_encode 只接受 UTF-8 的字符串进行 encode。

所以上面的问题只要将文件编辑转换成 UTF-8 就可以了。


判断错误

通过json_last_error函数就可以获取错误了:

$user = ['name' => '小明'];
$json = json_encode($user);

if($errorCode = json_last_error()){
	$error = '';
	if($errorCode == JSON_ERROR_NONE){
		$error = '没有错误发生';
		
	}elseif($errorCode == JSON_ERROR_DEPTH){
		$error = '到达了最大堆栈深度';
		
	}elseif($errorCode == JSON_ERROR_STATE_MISMATCH){
		$error = '无效或异常的 JSON';
		
	}elseif($errorCode == JSON_ERROR_CTRL_CHAR){
		$error = '控制字符错误,可能是编码不对';
		
	}elseif($errorCode == JSON_ERROR_SYNTAX){
		$error = '语法错误';
		
	}elseif($errorCode == JSON_ERROR_UTF8){
		$error = '异常的 UTF-8 字符,也许是因为不正确的编码。'; //最经常是遇到这个错误
		
	}elseif($errorCode == JSON_ERROR_RECURSION){
		$error = '被encode的数组存在互相引用的值';
		
	}elseif($errorCode == JSON_ERROR_INF_OR_NAN){
		$error = '被encode的数组存在NAN或INF的值';
		
	}elseif($errorCode == JSON_ERROR_UNSUPPORTED_TYPE){
		$error = '所传参数变量类型无法进行encode';
	}
	
	echo $error;
	
}else{
	echo $json;
}

相关参考:官方手册 - json_last_error

以后如果遇到json_encode执行失败没有输出的话,可以复制这块代码判断一下错误,不需要自己慢慢写了哦!