You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:21:56