簡體   English   中英

遍歷KEYLESS JSON數組嗎?

[英]Iterate over KEYLESS JSON array?

我正在構建一個購物車,並使用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”,是因為這是保留號,表明該產品是“自定義”產品(不直接涉及目錄項)。

UPDATE

基於下面的@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(添加自定義項時)在服務器上更新cookie上的數組,或者使用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;

    }

}

如果JSON沒有鍵,則它是一個數組,只需使用數組而不是鍵/值對來構建數據。

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

更新:

所以現在基於您的新答案,您似乎正在嘗試JSON.parse實際數組。 JSON.parse通常采用具有數組的字符串值,然后將其解析為實際數組。

要了解我的意思,請使用數據數組並通過JSON.stringify運行它,您將看到輸出,然后可以通過JSON.parse運行該輸出。

問題出在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就可以正常工作。

{
   "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對象存在結構性問題。 您應該考慮一個更好的結構,一個普通的數組應該足夠好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM