我们为我们的网站提供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;
}
答案 0 :(得分:1)
JSON有两种结构:一个“数组”,它有顺序但没有键,一个“对象”(哈希),它有键但没有顺序。另一方面,PHP将它们组合成一个结构,它称之为“数组”,它具有键和顺序。因此,PHP的json_encode
函数必须选择用于特定PHP数组的JSON结构。
在您的数据中,PHP数组$json['favourites']
包含两个字符串键(例如$json["favorites"]["favorites_type"]
)和自动递增的数字键(您使用$json["favorites"][]
的位置)。由于字符串键不能存在于JSON数组中,因此PHP json_encode
必须将其编码为JSON对象,这就是为什么您会看到键"0":
,"1":
等的原因。输出(例如,如果你在数组上使用了print_r
,则会看到相同的键。)
如果从该数组中删除字符串键(将该数据移动到结构中的其他位置),那么剩下的就是数字数组。由于这就像一个JSON数组,PHP会输出它,你不会在输出中看到键。
正如我在评论中指出的那样,围绕每个项目的金额保持不变 - 元素没有“相同的名称”,它们只是存在于有序结构中,而不是联想的。
以下是a code demo:
$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
}
}
]
}