json_decode返回一个空值而不是一个数组

时间:2015-06-19 21:02:44

标签: php json curl error-handling

我正在尝试在解码数据中搜索关键字电子邮件。但它无法从json_decode获取数组类型。

这是代码

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => $url,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36'
));

$resp = json_decode(curl_exec($curl), true);


if(is_array($resp) && array_key_exists("email", $resp))
{
  echo $data_arr[0] . "email: ";
  $content = $resp["email"];
  fwrite($fp,$content);
}

确切的错误是:

  

array_key_exists()期望参数2为数组,在第34行的index.php中给出null

编辑:我稍微弄清了错误。 Curl执行因错误(url格式错误)而失败。在这种情况下仍然无法弄清楚网址是如何格式错误的。网址就是这样提取的。

$data = fgets($fp);
$data_arr = split(",", $data);
$token_arr = isset($data_arr[1]) ? split('"', $data_arr[1]) : null;

$url = isset($token_arr[1]) ? "https://graph.facebook.com/v2.3/me?access_token=" . $token_arr[1] : null;

1 个答案:

答案 0 :(得分:0)

尝试使用utf8_encode

$data = curl_exec($curl);
$data = utf8_encode($data);
$resp = json_decode($data, true);
  

注意: utf8_decode仅适用于utf8

     

此功能仅适用于UTF-8编码的字符串。

     

PHP实现原始» RFC 4627中指定的JSON超集 - 它还将编码和解码标量类型和NULL。 RFC 4627仅在嵌套在数组或对象中时才支持这些值。   虽然这个超集符合" JSON文本的扩展定义"在较新的» RFC 7159(旨在取代RFC 4627)和» ECMA-404中,这可能会导致与编码单个标量值时严格遵守RFC 4627的旧JSON解析器的互操作性问题。

     

来源:http://php.net/manual/en/function.json-decode.php

需要在网址中编码参数,请尝试urlencoderawurlecnode,例如:

  

注意,我在()

中添加了? :
$data = fgets($fp);
$data_arr = split(",", $data);
$token_arr = isset($data_arr[1]) ? split('"', $data_arr[1]) : null;

$url = isset($token_arr[1]) ? ("https://graph.facebook.com/v2.3/me?access_token=" . urlencode($token_arr[1])) : null;

检查是否发送NULL

如果curl_error返回malformed表示$url = NULL,则问题出在生成令牌的代码中,请尝试以下操作:

$data = fgets($fp);
$data_arr = split(",", $data);
$token_arr = isset($data_arr[1]) ? split('"', $data_arr[1]) : null;

$url = isset($token_arr[1]) ? ("https://graph.facebook.com/v2.3/me?access_token=" . $token_arr[1]) : null;

if (empty($url)) {
   echo 'URL is NULL or EMPTY';
   exit;
}

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => $url,
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36'
));

$data = curl_exec($curl);
$data = utf8_encode($data);
$resp = json_decode($data, true);

if(is_array($resp) && array_key_exists("email", $resp))
{
  echo $data_arr[0] . "email: ";
  $content = $resp["email"];
  fwrite($fp,$content);
}