1

我正在构建一个购物车并使用 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];

这似乎行不通。

这个问题实际上有两个部分。

  1. 如何直接从篮子中挑选一个值?
  2. 如何遍历它,让我依次对每一行进行操作?

如果您想知道第一个字段。那是产品的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;

    }

}
4

3 回答 3

3

If the JSON has no keys then it's an array, simply build your data using an array instead of key/value pairs.

var data = [
    ['CentOS', ''],
    ['Another Product', ...],
];

UPDATE:

So now based on your new answer, it looks like you're trying to JSON.parse the actual array. JSON.parse usually takes in a string value which has the array and then parses it into an actual array.

To see what I mean take your data array and run it through JSON.stringify and you will see the output, that same output you can then run it through JSON.parse

于 2013-07-29T04:06:10.660 回答
0

问题出在 PHP 中:您 json_encode 您的数组两次。

在这里,您手动对其进行了一次编码:

$cookieVal .= ", [\"9999.9999\",\"$sltOS\",$vcpuPoints,\"".$ramPoints."\",$storagePoints,\"".$baseServerCostMonthUSD."\"]]";

然后在这里,你再做一次:

$cookieVal = json_encode($cookieVal);

因此,当您在 javascript 中解析 json 时,您会得到一个字符串。显然, secondbasket[1][4]给你一个未定义的值,因为basket它是一个字符串并且basket[1]是一个字符。

它有助于使用 firebug 或其他调试实用程序来查看您在每一步中获得的数据。

所以。只需在 PHP 中构建一个数组数组,然后对其进行 json_encode(一次),您的 js 就可以工作了。

于 2013-07-29T07:10:20.303 回答
-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"]
}

注意大括号。这表明这是一个对象。

您不能按数字索引遍历对象。还要注意重复键“9999.9999”,第一行将被第三行覆盖。

您可以尝试使用 for-in 循环来循环对象,但不建议这样做。

var basket = JSON.parse(basket);
for(var key in basket)
{
    var price = basket[key][4];
    // do something with the price.
}

无论如何,这个 JSON 对象存在结构问题。你应该考虑一个更好的结构,一个普通的数组应该足够好。

于 2013-07-29T04:28:09.847 回答