4

I have a simple array that I'm trying to JSON encode and set as a cookie. I am using the json2.js script to encode to JSON. I am using the following code to set the cookie:

jQuery(document).ready(function(){
    var ids = ['1', '2'];
    JSON.stringify(ids);
    setCookie(cookieName, ids, 1);
});

function setCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

After converting the array to JSON, and logging it in console, I get:

["1", "2"]

which is what I would expect. I then read out the cookie with the following function

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

When I read out the cookie and log it in the console, I get:

1,2

suggesting that its a string and no longer a JSON encoded object. I would like to be able to set a cookie an a JSON encoded object, read it out and parse the JSON object, and finally perform operations on the data. My question is thus, how do you send a JSON encoded object to the cookie in such a way that I can parse it as JSON when I read it out?

Thanks as always!

tollmanz
  • 3,113
  • 4
  • 29
  • 34

3 Answers3

6

Change this:

JSON.stringify(ids);
setCookie(cookieName, ids, 1);

To this:

var str = JSON.stringify(ids);
setCookie(cookieName, str, 1);
Jodes
  • 14,118
  • 26
  • 97
  • 156
  • Thank you so much! That's why I ask these questions. After working on this for a while, I cannot see little issues like this. – tollmanz May 22 '11 at 19:34
2

I don't see you actually using the result of the JSON stringification:

jQuery(document).ready(function(){
    var ids = ['1', '2'];
    setCookie(cookieName, JSON.stringify(ids), 1);
});

Try this instead

onteria_
  • 68,181
  • 7
  • 71
  • 64
2

Don’t use these cookie functions, they are flawed. setCookie fails to encode the name and value properly and getCookie fails for cookies with a common suffix (see my answer to Javascript getCookie functions).

For setCookie I would use this:

function setCookie(name, value, days) {
    var expires = "";
    if (days > 0) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    }
    document.cookie = encodeURIComponent(name)+"="+encodeURIComponent(value)+expires+"; path=/";
}
Community
  • 1
  • 1
Gumbo
  • 643,351
  • 109
  • 780
  • 844
  • I implemented this function; however, since doing so, when I attempt to delete a cookie using `setCookie(name,"",-1);` it deletes only the value of the cookie, not the cookie entirely. Prior to changing it to your function, it would work as expected. Any thoughts? Thanks again! – tollmanz May 22 '11 at 20:48
  • I solved this by setting `var expires = "; expires=Thu, 01-Jan-1970 00:00:01 GMT";` – tollmanz May 22 '11 at 20:54