我正在构建购物车并使用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。
在添加目录项时,可以使用PHP(在添加自定义项时)或客户端使用Javascript在服务器上更新cookie上的数组。
目前,我专注于添加服务器端的项目。我正在使用以下代码添加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;
}
}
答案 0 :(得分:3)
如果JSON没有密钥,那么它就是一个数组,只需使用数组而不是键/值对来构建数据。
var data = [
['CentOS', ''],
['Another Product', ...],
];
<强>更新强>
所以现在基于你的新答案,看起来你正试图JSON.parse
实际的数组。 JSON.parse
通常接受包含数组的字符串值,然后将其解析为实际数组。
要了解我的意思,请使用数据数组并通过JSON.stringify
运行它,您将看到输出,然后您可以通过JSON.parse
答案 1 :(得分:0)
问题出在PHP:你json_encode你的数组两次。
在这里你手动编码一次:
$cookieVal .= ",
[\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";
然后在这里,你再次这样做:
$cookieVal = json_encode($cookieVal);
因此,当您在javascript中解析json时,您会得到一个字符串。
显然,第二个basket[1][4]
会为您提供一个未定义的值,因为basket
是一个字符串而basket[1]
是一个字符。
使用firebug或其他调试实用程序来查看每一步获得的数据是有帮助的。
因此。只需在PHP中构建一个数组数组,然后json_encode它(一次),你的js应该可以工作。
答案 2 :(得分:-1)
{
"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"]
}
注意大括号。这表明这是一个对象。
您无法通过数字索引迭代对象。 还要注意重复的密钥&#34; 9999.9999&#34;,第一行将被第三行覆盖。
您可以尝试使用for-in循环来循环对象,但不建议这样做。
var basket = JSON.parse(basket);
for(var key in basket)
{
var price = basket[key][4];
// do something with the price.
}
无论如何,这个JSON对象存在结构问题。你应该考虑一个更好的结构,一个普通的数组应该足够好。