PHP请求异常:Expecting value: line 1 column 1 (char 0) 解决方案

学习笔记作者:admin日期:2025-09-16点击:0

摘要:在使用PHP的json_decode()函数时,遇到'Expecting value: line 1 column 1 (char 0)'错误,通常是因为返回的数据不是有效的JSON格式。本文提供了详细的排查步骤和解决方案。

问题描述

      在使用PHP的json_decode()函数解析接口返回数据时,遇到了以下错误:

请求异常: Expecting value: line 1 column 1 (char 0)

      该错误表明PHP无法解析返回的内容,因为传入的字符串不是合法的JSON。

原因分析

      此错误通常发生在以下几种情况:

  • API返回的是空字符串
  • API返回的是HTML内容(如错误页面)
  • 网络请求失败或超时
  • 服务器端返回了非JSON格式的数据

解决方案

1. 检查API返回内容是否正确

      在调用json_decode()之前,先输出API返回的内容,确认其是否为合法的JSON格式。

$response = file_get_contents('https://api.example.com/data');
var_dump($response);
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON 解析失败: " . json_last_error_msg();
    echo "\n返回内容: " . $response;
    exit;
}

2. 使用cURL获取更详细的请求信息

      通过cURL可以获取HTTP状态码和响应内容,帮助定位问题。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);

if ($error) {
    die("cURL 错误: " . $error);
}

if ($httpCode !== 200) {
    die("HTTP 错误码: " . $httpCode . ", 响应: " . $response);
}

if (empty($response)) {
    die("响应为空");
}

$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON 解析失败: " . json_last_error_msg() . "\n响应内容: " . $response);
}

var_dump($data);

3. 常见导致非JSON响应的原因

原因 解决方案
接口地址错误 检查URL是否正确
服务器500错误 查看后端日志
返回HTML错误页 检查目标服务是否正常运行
需要认证 添加Authorization头
跨域或Referer限制 伪造User-Agent或Referer

4. 调试方法

  • 将API地址复制到浏览器或Postman中测试
  • 打印$response内容,确认是否为预期数据
  • 检查HTTP状态码是否为200
  • 确认目标服务是否返回JSON数据

5. 安全的JSON解析函数

      封装一个安全的JSON解析函数,用于处理可能的错误。

function fetchJson($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Client');

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);

    if ($error) {
        throw new Exception("CURL Error: $error");
    }

    if ($httpCode !== 200) {
        throw new Exception("HTTP Error: $httpCode, Response: $response");
    }

    if (empty($response)) {
        throw new Exception("Empty response received");
    }

    $data = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception("JSON Decode Error: " . json_last_error_msg() . " | Raw: $response");
    }

    return $data;
}

// 使用
try {
    $result = fetchJson('https://api.example.com/data');
    var_dump($result);
} catch (Exception $e) {
    echo "请求失败: " . $e->getMessage();
}

总结

      错误提示“Expecting value: line 1 column 1 (char 0)”表明json_decode()接收到无效或空的响应内容。

      解决步骤:

  • 打印并检查$response内容
  • 确认接口返回的是JSON
  • 检查网络请求是否成功(HTTP 200)
  • 处理空响应或错误页面

上一篇      下一篇