ThinkPHP 5.1 数组转 JSON 失败主因是混入资源类型或编码不一致,需先遍历清理非法项并统一转 UTF-8,再用 json($data, 200, [], ['json_encode_param' => JSON_UNESCAPED_UNICODE]) 安全输出,漏掉空 header 数组会报 Array to string conversion。

ThinkPHP 5.1 中数组转 JSON 失败,常因字段混入资源类型(如数据库连接、文件句柄)或编码不一致导致 json_encode() 返回 false,接口直接空响应或报错 Array to string conversion。
检查并清理数组中的非法类型
第一步:遍历数组,用 is_resource() 和 gettype() 识别不可序列化项:
foreach ($data as $k => $v) { if (is_resource($v) || gettype($v) === 'object') { unset($data[$k]); } }
这一步必须做——json_encode() 遇到 resource 或未实现 JsonSerializable 的对象会静默失败,返回 false,但 TP5.1 的 json() 方法不会主动抛异常,只会输出空内容。
第二步:对字符串值强制转 UTF-8 编码,避免 mb_detect_encoding() 误判:
foreach ($data as $k => $v) { if (is_string($v) && !mb_check_encoding($v, 'UTF-8')) { $data[$k] = mb_convert_encoding($v, 'UTF-8', 'auto'); } }
【注意】不要用 iconv() 替代 mb_convert_encoding(),iconv 对非法字符默认截断,可能丢数据。
TP5.1 接口层安全输出 JSON
方法一:用 json() 辅助函数(推荐)
return json($data, 200, [], ['json_encode_param' => JSON_UNESCAPED_UNICODE]);
漏掉第三个参数(空数组 [])会触发 Array to string conversion 错误,因为该位置是 header 数组,不能为空值,但可为空数组。
方法二:手动构造 Response 实例
return response()->json($data, 200, [], JSON_UNESCAPED_UNICODE);
TP5.1 不再支持 ajaxReturn(),调用即报 Method not found: think\Response::ajaxReturn。
模型层 JSON 字段写入防双重编码
数据库字段为 JSON 类型(如 MySQL 的 json 列)时,必须同时配置 $type 和 $json:
$type = ['config' => 'json'];
$json = ['config'];
字段名 config 必须与数据库列名完全一致,大小写、下划线都不能错;只配 $type 或只配 $json,JSON 功能均失效。
赋值时直接传原生数组:
$model->config = ['timeout' => 30, 'retry' => 3];
$model->save();
【严禁】在赋值前手动 json_encode(),否则 TP 会再 encode 一次,存库变成 "{\"timeout\":30}" —— 典型双重编码。


















