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

Laravel中json_encode数组/集合报‘Type is not supported’错误求助

问题分析与解决方案

嘿,我一眼就揪出问题根源啦!从你贴的dd()输出能看到,substrates数组里的pic字段是stream resource(流资源),而json_encode()根本没办法序列化PHP的流资源类型,这就是为啥你会拿到错误码8(JSON_ERROR_UNSUPPORTED_TYPE)和"Type is not supported"提示的原因。

接下来给你几个适配你场景(看起来是Laravel框架)的解决方案,按需选就行:

方案1:直接隐藏不需要的流字段(最快)

如果前端根本用不上pic这个流资源字段,直接在对应的Substrate模型里加个$hidden属性,让模型转数组/JSON时自动排除它:

class Substrate extends Model
{
    protected $hidden = ['pic'];
    // 其他模型代码不变
}

这样再调用$this->substrates->all()->toArray()时,pic字段就不会出现在数组里,json_encode自然就能正常工作了。

方案2:把流资源转成可序列化的内容(需要保留字段时用)

要是你得把pic的内容放进JSON里,就在模型里写个访问器,把流转换成字符串或者base64编码:

class Substrate extends Model
{
    // 自定义pic字段的访问器
    public function getPicAttribute($value)
    {
        if (is_resource($value)) {
            // 先把流指针移到开头
            rewind($value);
            // 把流内容读取成字符串
            return stream_get_contents($value);
            // 如果是图片资源,想转成base64的话就用下面这句:
            // return base64_encode(stream_get_contents($value));
        }
        return $value;
    }
    // 其他模型代码不变
}

这样模型转数组的时候,pic就变成json_encode能处理的字符串啦。

方案3:控制器里手动处理数组(不想改模型时用)

要是不想动模型代码,也可以在控制器里手动过滤数组里的流资源:

$substrates = $this->substrates->all()->map(function ($substrate) {
    $substrateArray = $substrate->toArray();
    // 检查并处理pic字段
    if (isset($substrateArray['pic']) && is_resource($substrateArray['pic'])) {
        rewind($substrateArray['pic']);
        $substrateArray['pic'] = stream_get_contents($substrateArray['pic']);
        // 要是不想保留这个字段,直接unset($substrateArray['pic'])就行
    }
    return $substrateArray;
})->toArray();

$temp = json_encode($substrates);
dd($temp, json_last_error(), json_last_error_msg(), $substrates);

另外补充一句:你说用JSON_PARTIAL_OUTPUT_ON_ERROR能拿到JSON,是因为这个参数会让json_encode跳过无法序列化的类型,但对应的字段会被丢掉。如果想要完整有效的JSON,还是上面的方法更靠谱~

内容的提问来源于stack exchange,提问作者Munther Jaber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:42:10