常用知识 - json_encode的失败 ¶
作者:KK
发表日期:2016.9.15
如果按照一般的情况写代码,json_encode还是会执行失败,相信很多新手都可能意想不到或者没接触过.
当然如果传一个非数组进去叫人家encode这样的代码相信大家平时几乎不会写出来,所以只要传了数组进去却还是会encode失败那是为什么呢?
最典型的就是字符编码
重现这种错误 ¶
将文件编码设置成非
UTF-8
文件编写如下代码:
$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_encode执行失败没有输出的话,可以复制这块代码判断一下错误,不需要自己慢慢写了哦!