我正在构建一个购物车并使用 cookie 将购物车内容存储在 JSON 对象中。
在每个页面上,我需要使用 Javascript 检索 cookie、解析 JSON 并遍历每一行,以在购物篮摘要中显示所描述的产品。
我决定不使用数组中的键,因为如果我有每个位置指定的记录,为什么我需要将它存储在 cookie 中。我认为这是一个聪明的主意,但现在我所有的搜索结果都是使用密钥的建议。
这是 JSON 的示例:
{
"9999.9999":["CentOS6",2,"0.5",150,"23.90"],
"0002.0004":["Support5","","3",5,"12.99"],
"9999.9999":["UbuntuServer12.04LTS",1,"1",220,"42.60"]
}
例如,我期望能够访问第二条记录的“价格”(在每行的最后一个字段中),如下所示:
basket = JSON.parse(basket);
price = basket[1][4];
这似乎行不通。
这个问题实际上有两个部分。
- 如何直接从篮子中挑选一个值?
- 如何遍历它,让我依次对每一行进行操作?
如果您想知道第一个字段。那是产品的SKU。之所以有两个“9999.9999”,是因为这是一个保留编号,表示该产品是“定制”产品(不直接指目录项)。
更新
根据下面@Samer 的回答,我更新了代码以使用数组,如下所示:
JSON 现在看起来像这样:
[
["9999.9999","CentOS6",2,"0.5",150,"23.90"],
["0002.0004","Support5","","3",5,"12.99"],
["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"]
]
我现在尝试从 cookie 访问它,如下所示:
var basket = readCookie('basket');
basket = JSON.parse(basket);
alert( 'Price of item 2 =' + basket[1][5] );
只有,而不是提醒,“项目 2 的价格 = 12.99”我得到“项目 2 的价格 = 未定义”。
我想知道我做错了什么?
更新 2
仍然有这个问题。也许我应该解释一下我们是如何将数据放入 cookie 中的。
cookie 上的数组可以在服务器上使用 PHP(添加自定义项时)或在添加目录项时使用 Javascript 在客户端更新。
目前,我专注于添加服务器端的项目。我正在使用以下代码添加 cookie:
<?
extract($_POST, EXTR_SKIP);
// Get contents of existing basket (if any) minus last ']'
// so that it's ready to be added to.
if (isset($_COOKIE['basket'])) {
$basket = json_decode($_COOKIE['basket']);
$chars = strlen($basket)-1;
//echo "<pre>".var_dump($basket)."</pre>";
$cookieVal = substr($basket, 0, $chars);
$cookieVal .= ",
[\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";
$cookieVal = json_encode($cookieVal);
/*
* Sample format
*
[["9999.9999","CentOS6",2,"0.5",150,"23.90"],
["0002.0004","Support5","","3",5,"12.99"],
["9999.9999","UbuntuServer12.04LTS",1,"1",220,"42.60"]]
*
*/
} else {
$cookieVal = json_encode("[[\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]");
}
$exp = time()+3600; // sets expiry to 1 hour;
setcookie ( 'basket' , $cookieVal, $exp, '/' );
然后客户端读取cookie,我有这个,在页面加载时调用:
function initBasket() {
var basket = readCookie('basket');
if (isJSON(basket)) {
// We'll populate the basket
basket = JSON.parse(basket);
alert(basket[1][5]);
} else {
$('#sList').html('Your basket is empty.');
return;
}
}
更新 3 终于让它工作了。谢谢你的帮助。
也许代码可以帮助其他人,所以我在下面包含了最终代码:
PHP:
if (isset($_COOKIE['basket'])) {
$cookieVal = json_decode($_COOKIE['basket']);
$cookieVal[] = array
(
"9999.9999",
$sltOS,
$vcpuPoints,
$ramPoints,
$storagePoints,
$baseServerCostMonthUSD
);
$cookieVal = json_encode($cookieVal);
} else {
$cookieArr[] = array
(
"9999.9999",
$sltOS,
$vcpuPoints,
$ramPoints,
$storagePoints,
$baseServerCostMonthUSD
);
$cookieVal = json_encode($cookieArr);
}
// Save VPS choice in basket cookie
$exp = time()+3600; // sets expiry to 1 hour;
setcookie ( 'basket' , $cookieVal, $exp, '/' );
Javascript:
function initBasket() {
var basket = readCookie('basket');
if (isJSON(basket)) {
// We'll populate the basket
basket = JSON.parse(basket);
alert(basket[1][5]);
} else {
$('#sList').html('Your basket is empty.');
return;
}
}