1

我们为我们的网站提供一个 API,返回格式为 XML 和 JSON。两者都来自 PHP 数组。我的 JSON 返回是导致我出现问题的原因。如何返回同名元素而不是 [0]、1等?现在,我返回的样子是:

{
"rate": {
    "rate_span": "1 Minute",
    "rate_limit": "60",
    "rate_remaining": 59,
    "rate_user": "60"
},
"status": {
    "status_code": 200,
    "status_message": "Request was successful."
},
"favorites": {
    "0": {
        "favorite": {
            "lyric_id": "570"
        }
    },
    "1": {
        "favorite": {
            "lyric_id": "3530822107858532003"
        }
    },
    "2": {
        "favorite": {
            "lyric_id": "3530822107858535795"
        }
    },
    "favorites_type": "lyrics",
    "favorites_total": 3
}
}

我宁愿每个最爱都被包裹在它自己的“最爱” { ... 元素中,并绕过每个被包裹在 [0], 1 , [x+1].... 中的数组。就像这个 JSON 响应:ARTIST.ALBUMS .GET JSON

这是构建收藏夹部分的 PHP 数组...

$json["favorites"] = array();
$json["favorites"]["favorites_type"] = "lyrics";
$json["favorites"]["favorites_total"] = $userFavorites->recordCount();

foreach($userFavorites as $key => $fav) {
     $song_id = $fav["lyric_id"];
     $json["favorites"][]["favorite"]["lyric_id"] = $song_id;
}
4

1 回答 1

2

JSON 有两种结构:一个“数组”,它有顺序但没有键,以及一个“对象”(散列),它有键但没有顺序。另一方面,PHP 将这些组合成一个结构,称为“数组”,它既有键又有顺序。因此PHP 的json_encode函数必须选择用于特定 PHP 数组的 JSON 结构。

在您的数据中,PHP 数组$json['favourites']包含字符串键(例如$json["favorites"]["favorites_type"])和自动递增的数字键(您使用过的地方$json["favorites"][])。由于字符串键不能存在于 JSON 数组中,PHPjson_encode必须将其编码为 JSON 对象,这就是您在输出中看到键"0":"1":等的原因(这些键与您使用时看到的键相同)print_r例如,在阵列上)。

如果您从该数组中删除字符串键(将该数据移动到结构中的其他位置),那么剩下的就是数字数组。由于这就像一个 JSON 数组,PHP 会这样输出它,并且您不会在输出中看到键。

正如我在评论中指出的那样,每个项目的环绕保持不变 - 元素没有“相同的名称”,它们只是存在于有序结构中,而不是关联结构中。

这是一个代码演示

$json["favorites"] = array();
$json["favorites"]["favorites_type"] = "lyrics";

// Simlulating entries in loop:
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858532003));
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858535795));

echo "BEFORE:";
echo json_encode($json,  JSON_PRETTY_PRINT);

// Remove the problematic string key:
unset($json["favorites"]["favorites_type"]);

echo "<br>";

echo "AFTER:";
echo json_encode($json,  JSON_PRETTY_PRINT);

输出:

BEFORE:{
    "favorites": {
        "favorites_type": "lyrics",
        "0": {
            "favourite": {
                "lyric_id": 3530822107858532003
            }
        },
        "1": {
            "favourite": {
                "lyric_id": 3530822107858535795
            }
        }
    }
}
AFTER:{
    "favorites": [
        {
            "favourite": {
                "lyric_id": 3530822107858532003
            }
        },
        {
            "favourite": {
                "lyric_id": 3530822107858535795
            }
        }
    ]
}
于 2013-11-04T04:15:29.903 回答