迭代KEYLESS JSON数组?

时间:2013-07-29 04:03:52

标签: php javascript jquery json

我正在构建购物车并使用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. 如何迭代它,允许我依次操作每一行?
  3. 如果你想知道第一个字段。这是该产品的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;
    
        }
    
    }
    

3 个答案:

答案 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对象存在结构问题。你应该考虑一个更好的结构,一个普通的数组应该足够好。