嵌套数组json_encode失效:双MySQL查询结果无法JSON序列化
嗨,这种情况我踩过好多次坑了!var_dump能正常输出但json_encode返回空,大概率是字符编码不兼容或者数据里藏了JSON序列化不了的内容,给你几个实用的排查和解决办法:
问题排查与解决步骤
1. 优先检查MySQL连接的字符编码
JSON要求所有字符串必须是UTF-8编码,而如果你的MySQL数据库或查询返回的是GBK/GB2312这类非UTF-8格式的字符串,json_encode会直接返回空或者false。
解决办法很简单,在建立MySQL连接后立刻设置编码:
// 用utf8mb4能支持emoji等特殊字符,比传统utf8更全面 $mysqli->set_charset('utf8mb4');
或者也可以在执行查询前先运行这条SQL:
SET NAMES utf8mb4;
2. 手动处理数组中的编码问题
如果数据库编码没问题,但数据里还是有乱码或特殊字符,可以写个递归函数把所有字符串转成UTF-8:
function convertToUtf8($data) { if (is_array($data)) { foreach ($data as $key => $value) { $data[$key] = convertToUtf8($value); } } elseif (is_string($data)) { // 自动识别原编码并转成UTF-8 return mb_convert_encoding($data, "UTF-8", "auto"); } return $data; } // 在json_encode前先处理数据 $data = convertToUtf8($data); echo json_encode($data);
3. 查看JSON编码的具体错误信息
有时候光猜原因没用,直接看错误提示更高效。可以用json_last_error_msg()获取失败的具体原因:
$jsonResult = json_encode($data); if ($jsonResult === false) { echo 'JSON编码失败原因:' . json_last_error_msg(); } else { echo $jsonResult; }
比如如果提示Malformed UTF-8 characters, possibly incorrectly encoded,那就是编码问题实锤;如果是Recursion detected,说明数组里有循环引用(不过你的场景基本不会出现这种情况)。
4. 确认数组中没有无法序列化的类型
虽然fetch_assoc()返回的是关联数组,但如果你的查询包含BLOB这类字段,可能会返回资源类型,而JSON是无法序列化资源的。可以用var_dump仔细检查每个元素的类型,把资源转成字符串或者直接跳过这类字段。
内容的提问来源于stack exchange,提问作者Vie
相关产品推荐
相关产品推荐

