php合并多接口json数据需先json_decode($json, true)转关联数组,再array_merge()或+合并,最后json_encode();须避免字符串拼接、对象混入、编码混乱及结构不一致问题。

PHP 中用 json_encode() 合并多个接口返回的 JSON 数据,核心是先取数据、再合并数组、最后统一编码
直接调用 json_encode() 不会自动合并 JSON 字符串;必须先把各接口解析后的 PHP 数组合并好,再一次性编码。否则容易得到嵌套结构或字符串拼接错误。
- 别用
file_get_contents()拿到原始 JSON 字符串后直接 . 连接 —— 那只是字符串拼接,不是合法 JSON - 每个接口响应建议先用
json_decode($json, true)转成关联数组(true参数不能漏) - 合并推荐用
array_merge()(索引数组)或+运算符(关联数组键冲突时后者不覆盖,注意行为差异) - 若接口返回结构不一致(比如一个有
data字段,另一个是扁平字段),需手动对齐键名再合并
遇到 json_encode(): type is not supported 错误,大概率是合并前混入了对象或资源
常见于没处理 cURL 返回的 resource,或用了 json_decode() 但忘了加 true,导致返回 stdClass 对象。PHP 的 json_encode() 默认不支持对象(除非实现 JsonSerializable)。
- 检查每个接口解析结果:用
is_array()和is_object()判断类型 - 强制转数组:可用
(array) $obj,但注意它不会递归转换嵌套对象 —— 更稳妥的是始终用json_decode($str, true) - cURL 示例中记得加
CURLOPT_RETURNTRANSFER => true,否则curl_exec()返回bool或resource,无法 decode
需要保留原始接口的元信息(如耗时、状态码)?那就别扁平合并,改用结构化容器
纯数据合并适合前端只关心内容的场景;但调试或服务编排时,常需知道某段数据来自哪个接口、是否成功、耗时多少。
- 定义统一容器格式,例如:
['user' => ['data' => [...], 'status' => 200, 'time' => 123], 'order' => [...]] - 用
curl_multi_init()并行请求多个接口,比串行快;但注意错误处理要逐个检查curl_getinfo()和curl_error() - 合并后如果数据量大,可考虑用
JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_IGNORE减少编码开销和乱码风险
前端拿到合并后的 JSON 却解析失败?先看响应头和编码
json_encode() 输出的是 UTF-8 字符串,但若 PHP 文件本身是 GBK 编码,或输出前有空格/UTF-8 BOM,会导致 JSON 解析失败(尤其在 JavaScript 中静默失败)。
立即学习“PHP免费学习笔记(深入)”;
- 确保 PHP 文件保存为 UTF-8 无 BOM 格式
- 发送前清除输出缓冲:
ob_end_clean(),再用header('Content-Type: application/json; charset=utf-8') - 用
json_last_error()和json_last_error_msg()检查编码是否真成功 —— 很多“返回空白”问题其实是编码失败返回false











