【问题标题】:cURL / PHP / JSON - Why am I unable to parse results? [duplicate]cURL / PHP / JSON - 为什么我无法解析结果? [复制]
【发布时间】:2018-08-22 03:12:41
【问题描述】:

我正在使用以下代码从带有 JSON 结果的 API 中提取数据。

// Open connection
$ch = curl_init();

// Make the curl call
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$head = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);


  $data = json_decode($head,true); 
   foreach($data as $item) {
    $name = $item['name'];
    $description = $item['description'];
    echo "NAME: $name DESCRIPTION: $description";

 }

如果我使用 print_r($head) 我会看到所有结果,所以我知道 url、用户名、密码是好的,但是代码末尾的 echo 语句没有产生结果。

这是我 print_r($head) 时 JSON 的样例。至少其中一些。

{"events":[{"eventId":5183191,"name":"The Rhythm Rockets - FREE","description":"Summer Concert Series - The Rhythm Rockets . .\nFREE. Look for a YELLOW balloon. Bring a chair. PLEASE BE ON TIME (6:00 PM!) TO SIT WITH THE GROUP. Allow time for street parking. Expect a crowd. Meetup at 6pm - Showtime is 7pm. Food, wine and beer will be on sale.\nIn case of inclement weather, concerts will be held indoors at the Lincoln Center, 935 Maple Avenue. For weather updates, call[masked] after 5:30 pm. If moved inside, there is no way we can sit together.","primaryImage":{"smallImageUrl":"https://domainnamestorage.blob.core.windows.net/portalimages/portalimages/71021444-d72d-456c-a419-36b61ead5259.small.png","mediumImageUrl":"https://domainnamestorage.blob.core.windows.net/portalimages/portalimages/71021444-d72d-456c-a419-36b61ead5259.medium.png","largeImageUrl":"https://domainnamestorage.blob.core.windows.net/portalimages/portalimages/71021444-d72d-456c-a419-36b61ead5259.large.png"},"categories":[{"categoryId":2,"parentCategoryId":null,"name":"Performing Arts"},{"categoryId":12,"parentCategoryId":null,"name":"Food & Drink"},{"categoryId":17,"parentCategoryId":2,"name":"Music"},{"categoryId":75,"parentCategoryId":12,"name":"Drinks"},{"categoryId":100,"parentCategoryId":17,"name":"Concerts"}],"location":{"latitude":41.792683,"longitude":-88.011765,"city":"Downers Grove","state":"IL","address":"1000 Grove St","country":"United States","locationName":"Fishel Park"},"instances":[{"startDateTime":"2018-08-21T18:00:00Z","endDateTime":null,"hasTime":true,"allDay":false}],"price":{"lowerPrice":null,"upperPrice":null,"free":false,"description":null},"lastUpdatedDate":"2018-07-26T02:20:49.686Z","popularity":null,"interest":50,"links":[{"isSponsor":false,"name":"Meetup","linkUrl":"https://www.meetup.com/Im-Not-Dead-Yet-50-plus/events/252406255/","logoUrl":null},{"isSponsor":true,"name":"I'm Not Dead Yet --- 50+ Meetup","linkUrl":"http://Meetup.com/Im-Not-Dead-Yet-50-plus","logoUrl":null},{"isSponsor":true,"name":"I'm Not Dead Yet --- 50+ Meetup","linkUrl":"http://Meetup.com/Im-Not-Dead-Yet-50-plus","logoUrl":null}],"previousEventIds":[],"seriesStart":"2018-08-21T18:00:00Z","seriesEnd":null,"url":"http://portal.domainname.com/m/FireVite#!/details/THE-RHYTHM-ROCKETS-FREE/5183191/2018-08-21T18","handPicked":false,"customField":null,"contact":{"organization":null,"name":null,"email":null,"phone":null},"media":null}

【问题讨论】:

  • Content-type: 标头没有负载就没有意义。一个 Accept: 可能是可取的。

标签: php arrays json curl


【解决方案1】:

解码后,$data 将有一个名为 events 的数组,其中每个元素都是您要查看的数组。试试:

foreach ($data['events'] as $item)...

【讨论】:

    【解决方案2】:

    print_r() 对string 没有意义,而仅对array 和object 有意义。

    它可能和这个很相似(也许你必须改用$data['events'])

    当使用$data = json_decode($response); 时,它将是$data->events:

    $data = json_decode($response, true);
    
    // die('<pre>'.print_r($data, true).'</pre>');
    
    foreach($data['events'] as $key => $item) {
    
        // $event_id = $data['events'][$key]['eventId'];
        $event_id = $item['eventId'];
    
        // $name = $data['events'][$key]['name'];
        $name = $item['name'];
    
        // $desc = $data['events'][$key]['description'];
        $desc = $item['description'];
    
        echo "KEY: $key, ID: $event_id, NAME: $name, DESCRIPTION: $desc";
    }
    

    那些内联 cmets 只是指示实际访问的内容。

    【讨论】:

    • 废话,print_r() 适用于字符串。
    • 这很好,但请再次检查上面的 JSON 示例...我添加了更多要检索的数据...如何补偿诸如“primaryImage”和“Location”之类的数组...当我使用您为所有字符串变量提供的相同代码时,只返回“数组”。
    • @Brad 这样做的具体目的是什么??
    • @disruptekz 这样的 JSON 响应可能包含嵌套数组/对象,需要在嵌套循环中进行解析,就像正在处理结构的最顶层一样。
    猜你喜欢
    • 2018-11-27
    • 2019-11-14
    • 2016-10-18
    • 1970-01-01
    • 2015-03-08
    • 2021-09-04
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多