【问题标题】:Problems with parsing JSON objects解析 JSON 对象的问题
【发布时间】:2014-08-23 18:06:03
【问题描述】:

我的网站调用 Spotify Web API 并获取给定用户的所有公共播放列表。响应最初是 JSON,但我的代码对其进行了解码。

我想要代码做的下一件事是只显示对象 [external_urls][name][tracks] 对于响应中的每个项目。为此,我已经尝试过:

foreach($response_2['items'] as $item) {
echo 'Link: ' . $item['external_urls'] . '<br />'; 
echo 'Name: ' . $item['name'] . '<br />';
echo 'Tracks: ' . $item['tracks'] . '<br />'; }

...但它不能正常工作。所有 [name] 对象(即a string)都正确回显,但对于所有 [external_urls][tracks](其中是objects) 它只在浏览器中显示“数组”。

我想我应该对这些对象使用 print_r(),但我无法让它工作。

有什么建议吗?

我的代码:

<?php

$url = 'https://accounts.spotify.com/api/token';
$method = 'POST';

$credentials = "hidden:hidden";

$headers = array(
        "Accept: */*",
        "Content-Type: application/x-www-form-urlencoded",
        "Authorization: Basic " . base64_encode($credentials));
$data = 'grant_type=client_credentials';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_1 = curl_exec($ch);

curl_close($ch);

$response_1 = json_decode($response_1, true);

$token = $response_1['access_token'];

$headers_2 = array(
        "Accept: */*",
        "Content-Type: application/x-www-form-urlencoded",
        ('Authorization: Bearer ' . $token));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://api.spotify.com/v1/users/wizzler/playlists');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_2);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_2 = curl_exec($ch);

curl_close($ch);

$response_2 = json_decode($response_2, true);

?>

API 响应:

{
    "href": "https://api.spotify.com/v1/users/wizzler/playlists",
    "items": [
        {
            "collaborative": false,
            "external_urls": {
                "spotify": "http://open.spotify.com/user/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c"
            },
            "href": "https://api.spotify.com/v1/users/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c",
            "id": "53Y8wT46QIMz5H4WQ8O22c",
            "name": "Wizzlers Big Playlist",
            "owner": {
                "external_urls": {
                    "spotify": "http://open.spotify.com/user/wizzler"
                },
                "href": "https://api.spotify.com/v1/users/wizzler",
                "id": "wizzler",
                "type": "user",
                "uri": "spotify:user:wizzler"
            },
            "public": true,
            "tracks": {
                "href": "https://api.spotify.com/v1/users/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c/tracks",
                "total": 30
            },
            "type": "playlist",
            "uri": "spotify:user:wizzler:playlist:53Y8wT46QIMz5H4WQ8O22c"
        },
        {
            "collaborative": false,
            "external_urls": {
                "spotify": "http://open.spotify.com/user/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju"
            },
            "href": "https://api.spotify.com/v1/users/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju",
            "id": "1AVZz0mBuGbCEoNRQdYQju",
            "name": "Another Playlist",
            "owner": {
                "external_urls": {
                    "spotify": "http://open.spotify.com/user/wizzlersmate"
                },
                "href": "https://api.spotify.com/v1/users/wizzlersmate",
                "id": "wizzlersmate",
                "type": "user",
                "uri": "spotify:user:wizzlersmate"
            },
            "public": true,
            "tracks": {
                "href": "https://api.spotify.com/v1/users/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju/tracks",
                "total": 58
            },
            "type": "playlist",
            "uri": "spotify:user:wizzlersmate:playlist:1AVZz0mBuGbCEoNRQdYQju"...
        }
    ],
    "limit": 9,
    "next": null,
    "offset": 0,
    "previous": null,
    "total": 9
}

【问题讨论】:

  • JSON decode shows "Array" 的可能副本
  • 您之前的问题也适用于此。无法使用echo 输出对象和数组。对对象和数组使用var_dump()print_r()...
  • 正如我在问题中提到的那样,我已经尝试过:“我想我应该对这些对象使用 print_r(),但我无法让它工作。”。我可以混合print_r()echo 相同的“foreach”吗?当我这样做时,当我使用它时它仍然会得到“数组”:print_r ('Link: ' . $item['external_urls'] . '&lt;br /&gt;');
  • echo 强制将数组转换为字符串。将它与另一个字符串连接并调用 print_r after. 也是如此

标签: php json parsing object spotify


【解决方案1】:

external_urlstracks 都是对象。为了获取数据,您要么需要知道确切的属性,要么将它们转换为数组(array) 并遍历新创建的数组以确保输出所有值。由于名称是复数形式,我假设您可以拥有多个外部网址和多个曲目。出于这个原因,我将属性转换为数组并遍历它们:

foreach($response_2['items'] as $item) {
    echo "LINKS <br />";
    $item['external_urls'] = (array)$item['external_urls'];
    foreach($item['external_urls'] as $key => $value) {
        echo ucfirst($key) . ": " . $value . "<br />";
    }
    echo "Name: " . $item['name'] . "<br />";
    echo "TRACKS <br />";
    $item['tracks'] = (array)$item['tracks'];
    foreach($item['tracks'] as $key => $value) {
        echo ucfirst($key) . ": " . $value . "<br />";
    } 
}

或者,如果您知道您将只有一个 url 和一个轨道并且您知道属性名称,则可以使用对象语法object-&gt;key; 访问属性。上面的相同示例在下面使用对象语法重写:

foreach($response_2['items'] as $item) {
    echo "LINKS <br />";
    echo "Spotify: " . $item['external_urls']->spotify . "<br />";
    echo "Name: " . $item['name'] . "<br />";
    echo "TRACKS <br />";
    echo "Href: " . $item['tracks']->href . "<br />";
    echo "Total: " . $item['tracks']->total . "<br />";
}

第 1 项的示例输出:

LINKS
Spotify: http://open.spotify.com/user/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c
Name: Wizzlers Big Playlist
TRACKS
Href: https://api.spotify.com/v1/users/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c/tracks
Total: 30

【讨论】:

  • 谢谢!起初它不起作用,但后来我注意到“echo ucfirs”缺少一个“t”。我如何显示这样的项目:Wizzlers Big Playlist
  • 在他的例子中,它们是数组,而不是对象。注意他是如何调用 json_decode 的。
  • 谢谢大家!这是我使用foreach($response_2['items'] as $item) { $item['external_urls'] = (array)$item['external_urls']; foreach($item['external_urls'] as $key =&gt; $value) { echo "&lt;a href='" . $value . "'&gt;" . $item['name'] . "&lt;/a&gt;" . "&lt;br /&gt;"; } 的代码它显示每个播放列表(项目)如下:Movie Soundtrack Masterpieces
猜你喜欢
  • 2018-07-18
  • 2017-12-10
  • 2013-02-16
  • 2020-12-08
  • 2014-01-21
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多