json_encode无法正常工作求助:数组含三个元素时无输出
老哥,遇到json_encode突然罢工的情况确实头疼,尤其是之前两元素数组还正常,加了第三个就彻底没输出——结合你提到的用json_last_error排查,我给你梳理几个实操性强的解决方向:
首先,先把错误信息“翻译”成人能看懂的内容!json_last_error()返回的是错误码,对排查来说不够直观,换成json_last_error_msg()直接拿可读描述:
$jsonResult = json_encode($datas); if ($jsonResult === false) { die('JSON编码失败原因:' . json_last_error_msg()); }
接下来,针对三元素数组才出问题的场景,大概率是新增的那个元素搞的鬼,重点排查这几个常见坑:
非UTF-8编码的字符:JSON标准强制要求所有字符必须是UTF-8,如果你新增的元素里有GBK/GB2312编码的中文、特殊符号,直接会导致编码失败。可以给数组做全局转码处理:
// 递归遍历数组,把非UTF-8字符串转成UTF-8 array_walk_recursive($datas, function(&$val) { if (is_string($val) && !mb_check_encoding($val, 'UTF-8')) { $val = mb_convert_encoding($val, 'UTF-8', 'auto'); } });包含不可序列化的特殊类型:
json_encode只能处理标量(字符串、数字、布尔)、普通数组、stdClass对象,如果新增的元素里藏着资源类型(比如数据库连接句柄、文件指针)、闭包函数,或者自定义的未实现JsonSerializable接口的对象,都会直接返回false。赶紧用var_dump($datas)打印整个数组,看看新增元素的类型是不是不对劲。试试容错参数兜底:要是暂时找不到问题,可以给
json_encode加个JSON_PARTIAL_OUTPUT_ON_ERROR参数,这样即使有错误,也会输出能正常编码的部分,方便你定位到底是哪个元素炸了:echo json_encode($datas, JSON_PARTIAL_OUTPUT_ON_ERROR);
最后提个小细节:判断编码是否成功一定要用$jsonResult === false,别用empty($jsonResult)——因为空数组编码后是"[]",empty会误判它为空,但其实是正常输出。
要是你把json_last_error_msg()的结果贴出来,能更精准地帮你定位问题,但上面这几个方向应该能解决大部分场景了!
内容的提问来源于stack exchange,提问作者Sam

