PHP使用json_encode输出含对象数组的JSON时返回空白,求指导
解决json_encode输出空数组的问题
嘿,我之前踩过几乎一模一样的坑!你遇到的情况大概率是$repeatSerialNumArray里藏着json_encode处理不了的内容,导致整个序列化失败返回空。下面是我亲测有效的排查和解决步骤:
第一步:先搞清楚到底为啥失败
别瞎猜,直接用PHP自带的错误提示工具,在调用json_encode之后打印错误信息:
$jsonResult = json_encode($output); if ($jsonResult === false) { echo "JSON序列化错误:" . json_last_error_msg(); }
这一步能直接告诉你根因——比如是循环引用、非UTF-8字符,还是不支持的数值类型,比瞎试高效10倍。
常见问题对应的解决方法
1. 数组里有非UTF-8编码的字符串
json_encode只认UTF-8编码的字符串,要是$repeatSerialNumArray里有GBK、GB2312这类编码的内容,直接就会返回空。可以批量转码:
// 递归遍历数组,把所有非UTF-8字符串转成UTF-8 array_walk_recursive($repeatSerialNumArray, function(&$value) { if (is_string($value) && !mb_check_encoding($value, 'UTF-8')) { $value = mb_convert_encoding($value, 'UTF-8', 'auto'); } });
2. 存在循环引用的对象
如果$repeatSerialNumArray里是自定义对象,很可能出现循环引用(比如对象A里引用了对象B,对象B又引用回A),这时候json_encode会直接罢工。解决方法有两种:
- 给对象实现
JsonSerializable接口,手动指定要序列化的字段(排除循环引用的部分):
class YourObject implements JsonSerializable { public $id; public $content; public $parent; // 这个是循环引用的字段 public function jsonSerialize() { // 只序列化需要的字段,跳过parent return [ 'id' => $this->id, 'content' => $this->content ]; } }
- 或者用
JSON_PARTIAL_OUTPUT_ON_ERROR参数强制输出能序列化的部分(适合临时排查):
$jsonResult = json_encode($output, JSON_PARTIAL_OUTPUT_ON_ERROR);
3. 包含JSON不支持的特殊类型
比如NaN、Infinity这类数值,或者数据库资源对象(比如PDO结果集没转成数组):
- 数值问题:提前把
NaN转成null,Infinity转成一个合法的数值(比如PHP_INT_MAX) - 资源对象:把数据库查询结果先转成数组,比如用
fetchAll(PDO::FETCH_ASSOC)
4. 数组里有未初始化的变量或空资源
用var_dump($repeatSerialNumArray)打印数组结构,看看有没有resource类型的条目,或者NULL之外的奇怪空值,把这些清理掉再序列化。
最后验证
处理完$repeatSerialNumArray之后,再赋值给$output['repeatObjects'],然后调用json_encode,应该就能正常输出了!
内容的提问来源于stack exchange,提问作者johnDoe
相关产品推荐
相关产品推荐

