
当 curl 返回的 JSON 响应中 "data" 字段本身仍是 JSON 字符串(而非数组),直接 json_decode($result, true)["data"] 会得到字符串 "{"data":[...]}",需二次 json_decode 才能访问内部数组。
当 `curl` 返回的 json 响应中 `"data"` 字段本身仍是 json 字符串(而非数组),直接 `json_decode($result, true)["data"]` 会得到字符串 `"{"data":[...]}"`,需二次 `json_decode` 才能访问内部数组。
问题根源在于:API 返回的响应结构是 双重 JSON 编码 的——整个响应体是合法 JSON,但其 "data" 字段的值又是一个 JSON 字符串(而非原生数组)。因此,仅一次 json_decode 只能解出外层结构,此时 $data["data"] 实际是字符串,而非关联数组或列表,echo $data["data"] 输出 "{" 是该字符串的首字符,foreach 自然会报错(Invalid argument supplied for foreach())。
✅ 正确做法是:对 $data["data"] 再次执行 json_decode:
$result = curl_exec($ch); // 假设这是你的 curl 响应
$data = json_decode($result, true);
// 检查解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Failed to decode outer JSON: ' . json_last_error_msg());
}
// 确保"data"字段存在且为字符串
if (!isset($data['data']) || !is_string($data['data'])) {
throw new InvalidArgumentException('Missing or invalid "data" field');
}
// 第二次解码:将"data"字符串转为PHP数组
$images = json_decode($data['data'], true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Failed to decode inner "data": ' . json_last_error_msg());
}
// 现在可以安全遍历
foreach ($images as $index => $base64Image) {
echo "Image {$index}: " . substr($base64Image, 0, 30) . "...\n";
}
⚠️ 注意事项:
- 始终校验 json_decode() 的返回值及 json_last_error(),避免静默失败;
- 使用 is_string() 和 isset() 预判字段类型,防止 null 或 false 导致后续操作异常;
- 若 API 文档明确说明 "data" 是 base64 图片数组,则建议推动后端修复——返回标准 JSON 结构(即 "data": ["...", "..."]),而非 "data": "[\"...\",\"...\"]" 这类字符串化数组,这是设计缺陷;
- 在调试阶段可用 var_dump(gettype($data['data']), $data['data']) 快速确认字段真实类型。
总结:遇到 echo $data["data"] 输出 { 的情况,几乎可断定该字段是未解码的 JSON 字符串——牢记“一层响应,一层解码”,嵌套 JSON 必须逐层 json_decode。











