【问题标题】:Parsing JSON API with PHP用 PHP 解析 JSON API
【发布时间】:2019-12-10 05:13:17
【问题描述】:

我正在处理 BooksRun API,我无法显示使用 PHP foreach 从 API 返回的任何数据。我的代码如下。提前致谢!

BooksRun API Reference

<?php
//PARAMETERS
$url = 'https://booksrun.com/api/v3/price/buy/0134093410?key=0t8rfbno7qc4lmaav9yz';

$headers = array(
"Content-type: application/json;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: \"run\""
 ); 

$cURL = curl_init();

curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_HTTPGET, true);
curl_setopt($cURL, CURLOPT_HTTPHEADER, $headers);
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($cURL);
curl_close($cURL);
//Json Data decoded on PHP object
$obj_data = json_decode($result);

echo '<div>' . 'start : '.$obj_data->result->status . '</div>';
//echo '<div>' . 'date: '.$obj_data->result->offers->booksrun->new->price . '</div>';
//echo '<div>' . 'date: '.$obj_data->result->marketplace->used->price . '</div>';

foreach ($obj_data->result as $book) {
//fetch object data

echo '<div>' . 'seller: '.$book->offers->booksrun->rent->price . '</div>';
echo '<div>' . 'date: '.$book->marketplace->used->price . '</div>';

  }
?>

【问题讨论】:

  • 您检查过$obj_data 的值吗?有什么东西进来吗?做var_dump($obj_data);并检查。让我们知道你得到了什么?有可能你一无所获
  • 这里不要贴你原来的key,也不需要循环遍历result
  • "rent"之后有一个键"35",所以应该是-&gt;rent-&gt;{"35"}-&gt;price。我不知道那个 3t5 是什么,或者它是否动态变化。

标签: php json api curl foreach


【解决方案1】:

我认为您需要更改代码,因为 json 中有一个数组 也许你可以改成这个代码

<?php
//PARAMETERS
$url = 'https://booksrun.com/api/v3/price/buy/0134093410?key=0t8rfbno7qc4lmaav9yz';

$headers = array(
"Content-type: application/json;charset=\"utf-8\"",
"Accept: text/xml",
"Cache-Control: no-cache",
"Pragma: no-cache",
"SOAPAction: \"run\""
 ); 

$cURL = curl_init();

curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_HTTPGET, true);
curl_setopt($cURL, CURLOPT_HTTPHEADER, $headers);
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($cURL);
curl_close($cURL);
//Json Data decoded on PHP object
$obj_data = json_decode($result);
echo '<div>' . 'start : '.$obj_data->result->status . '</div>';
//echo '<div>' . 'date: '.$obj_data->result->offers->booksrun->new->price . '</div>';
//echo '<div>' . 'date: '.$obj_data->result->marketplace->used->price . '</div>';

//fetch object data
foreach ($obj_data->result->offers->booksrun->rent as $rent) {
    echo '<div>' . 'seller: '.$rent->price . '</div>';
}
foreach ($obj_data->result->offers->marketplace as $marketplace) {
    echo '<div>' . 'date: '.$marketplace->used->price. '</div>';
}
?>

你的代码中的问题是你想打开一个对象,但实际上它是一个数组

【讨论】:

    【解决方案2】:

    只需进行以下更改:

    echo '<div>' . 'seller: '.$obj_data->result->offers->booksrun->rent->{"35"}->price . '</div>';
    echo '<div>' . 'date: '.$obj_data->result->offers->marketplace[0]->used->price . '</div>';
    

    $obj_data-&gt;result-&gt;offers-&gt;marketplace 是一个数组,所以你可以循环它。

    没有必要循环遍历结果对象,因为它只有一项。

    【讨论】:

    • 如果 JSON 数据集有时是单个结果,有时是数组怎么办?在我看来,API 动态显示 {"35"},所以数字一直在变化......对我来说有点愚蠢,但他们必须有一个理由......
    • 如果数据集返回多个值,那么您将不得不使用 foreach 循环。此外,如果您正在寻找动态密钥解析,请参阅此stackoverflow.com/questions/31285360/…
    【解决方案3】:

    如果你添加它可能会有用

    curl_setopt($cURL, CURLOPT_SSL_VERIFYPEER, false); 
    

    之后

    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
    

    【讨论】:

    • 因为API是HTTPS,这个选项可以让你跳过对对端证书的验证,得到$result。
    • 谢谢你的朋友。这是一个很好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多