【问题标题】:php, JSON: cURL object not editable with PHPphp, JSON: cURL 对象不能用 PHP 编辑
【发布时间】:2012-01-04 18:15:02
【问题描述】:

我正在尝试从另一个页面中提取 JSON 对象,然后将其分解为片段和值到我的 php 文档的变量中,并用它们填充页面。

我遇到的问题是,虽然 curl_exec 调用打印 JSON 对象,但从那时起我无法对其执行任何操作。以下是我的代码:

$json_url = "localhost:8080/query";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_URL, $json_url);
curl_setopt($ch, CURLOPT_USERPWD, $user.":".$pass);  
$result = json_decode(curl_exec($ch));
var_dump ($result);

$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);

curl_close($ch);

// ON SUCCESS

$json_a =  $result[10];
var_dump ($json_a);

以下是部分结果的示例:

 ["4"]=> array(2) { [0]=> int(1325003843) [1]=> array(2) { [0]=> int(47) [1]=> array(17) { [0]=> array(2) { [0]=> int(0) [1]=> int(1) } [1]=> array(2) { [0]=> int(17) [1]=> int(44) } [2]=> array(2) { [0]=> int(3) [1]=> int(4) } [3]=> array(2) { [0]=> int(3) [1]=> int(4) } [4]=> array(2) { [0]=> int(3) [1]=> int(4) } [5]=> array(2) { [0]=> int(3) [1]=> int(4) } [6]=> array(2) { [0]=> int(3) [1]=> int(4) } [7]=> array(2) { [0]=> int(3) [1]=> int(4) } [8]=> array(2) { [0]=> int(3) [1]=> int(4) } [9]=> array(2) { [0]=> int(3) [1]=> int(4) } [10]=> array(2) { [0]=> int(3) [1]=> int(4) } [11]=> array(2) { [0]=> int(3) [1]=> int(4) } [12]=> array(2) { [0]=> int(3) [1]=> int(4) } [13]=> array(2) { [0]=> int(2) [1]=> int(3) } [14]=> array(2) { [0]=> int(2) [1]=> int(3) } [15]=> array(2) { [0]=> int(2) [1]=> int(3) } [16]=> array(2) { [0]=> int(2) [1]=> int(3) } } } }

var_dump ($result);返回 int(1) 而另一个 var_dump 返回 NULL。 curl_exec 实际上打印 JSON 对象,所以我知道它至少在抓取它。非常感谢您提供的任何帮助!

【问题讨论】:

    标签: php json curl


    【解决方案1】:

    当 CURLOPT_RETURNTRANSFER 设置为 false 时,curl_exec 只返回 true 或 false。 将 CURLOPT_RETURNTRANSFER 设置为 true,curl_exec 应该会为您返回结果。

    【讨论】:

    • 换句话说,如果returntransfer为false,curl会将结果输出到客户端而不是返回到脚本。
    • 好的,非常感谢!现在,当我解码 $ch 时,第一个 var_dump 打印“array(2)..”,然后将 JSON 对象打印为一个数组。但我的第二个 var_dump 仍然显示为 Null。
    • 你能发布第一个 var_dump 的输出吗?看起来$result 是一个只有两个项目的数组,所以引用索引可能应该返回 null?
    • 好吧,看来你的问题是$result 中没有索引10... 你确定应该有吗?
    • 是的,实际上这只是它的第一部分。索引 10 只包含不太适合发布的信息。这是它的初始部分: ["10"]=> object(stdClass)#2 (17) { ["0"]=> array(2) { [0]=> int(1325003844) [1]= > array(2) { [0]=> int(31) [1]=> string(19) "ONBOARD TEMPERATURE" } } 这只是索引的第一部分。谢谢!
    【解决方案2】:

    你也可以这样做

    $json_url = "localhost:8080/query";
    // $protocol should be the protocol used, ie. 'ftp://', 'http://' or 'https://'
    //  to produce an URL like 'ftp://user:pass@localhost:8080/query'
    $result = file_get_contents($protocol . $user.":".urlencode($pass) . '@' . $json_url);
    
    if($result !== false) { // ON SUCCESS
      $result = json_decode($result, true);
      var_dump ($result);
    
      if(isset($result[10])) { // If index 10 of $result exists
        $json_a =  $result[10];
        var_dump ($json_a);
      }
    } else {
      // error occured
    }
    

    【讨论】:

    • 非常感谢!这会取代上面的整个代码段吗?另外,$protocol 是什么?非常感谢,如果您需要我提供任何其他信息,请告诉我!
    • 嗯,取决于你的$json_url 包含什么。如果您可以将它与 var_dumps 一起包含在上面的代码中,我将相应地更新我的答案。
    • 好的,我更新了问题,然后还添加了部分结果。这是一个非常大的物体,所以很难包含整个物体......
    • 我更新了答案以反映问题中代码的功能。
    • 好的,太好了! $results 的 var_dump 的结果效果很好。我确实注意到,当我尝试验证此处输出的 JSON 对象时,我在开始时遇到了错误。我正在用 JSON 对象的初始部分更新我的问题。
    猜你喜欢
    • 2016-08-10
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2014-09-12
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多