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
相关产品推荐
相关产品推荐

