PHP中将数组转为JSON遇报错,寻求正确实现方案
问题分析与解决方案
我来帮你梳理下问题,然后给出靠谱的解决步骤:
1. 第一种方法报错的原因
utf8_encode() 只能处理单个字符串,但你直接把 fetchAll() 返回的数组传进去了,自然会触发类型不匹配的警告。你要做的是把数组里的每一个字符串转成UTF-8编码,而不是给整个数组套这个函数。
2. 最省心的解决方案:从根源解决编码问题
其实不用事后转码,在PDO连接数据库的时候直接指定UTF-8编码,这样fetchAll()拿到的数组本身就是UTF-8格式的,后续转JSON一步到位:
// 连接数据库时指定编码(推荐用utf8mb4支持全表情和特殊字符) $dsn = 'mysql:host=你的主机地址;dbname=你的数据库名;charset=utf8mb4'; $pdo = new PDO($dsn, '用户名', '密码'); // 直接转JSON即可 $this->resul = json_encode($this->sqry->fetchAll(PDO::FETCH_ASSOC));
3. 已拿到非UTF-8数组的补救办法
如果没法修改PDO连接参数,可以用递归遍历的方式,把数组里的每个字符串都转成UTF-8:
$rawArray = $this->sqry->fetchAll(PDO::FETCH_ASSOC); // 递归处理数组内的所有字符串 array_walk_recursive($rawArray, function(&$value) { if (is_string($value)) { $value = utf8_encode($value); } }); $this->resul = json_encode($rawArray);
4. 第二种方法的错误根源
你输出的时候加了<br>标签,这会让响应内容里混入非JSON字符,直接破坏了JSON的格式,所以前端解析时会报错。而且设置header('Content-type: application/json')后,响应内容必须是纯JSON字符串,不能有任何多余的内容(包括换行、空格、HTML标签)。
正确的输出方式应该是:
header('Content-type: application/json'); // 直接输出JSON,不要加任何额外字符 echo json_encode($this->fresul); exit; // 确保后面没有意外输出
总结
优先选择在PDO连接时指定UTF-8编码,这是最简洁的方案;如果必须转码,用递归处理数组内的每个字符串;输出JSON时一定要保证内容纯净,同时正确设置响应头。
内容的提问来源于stack exchange,提问作者axmug
相关产品推荐
相关产品推荐

