创建具有相同名称元素的json?

时间:2013-11-04 03:46:28

标签: php

我们为我们的网站提供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;
}

1 个答案:

答案 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
            }
        }
    ]
}