jQuery将json数据对象保存在cookie中


108

如何将JSON数据保存在Cookie中?

我的JSON数据如下所示

$("#ArticlesHolder").data('15', {name:'testname', nr:'4',price:'400'});
$("#ArticlesHolder").data('25', {name:'name2', nr:'1', price:'100'});
$("#ArticlesHolder").data('37', {name:'name3', nr:'14', price:'60'});

我想做类似的事情

var dataStore = $.cookie("basket-data", $("#ArticlesHolder").data());

和检索数据我想将其加载到$("#ArticlesHolder")

$.each($.cookie("basket-data"), function(i,e){
 $("#ArticlesHolder").data(i, e);
});

有谁知道我走的路是否正确,还是应该以其他方式做到这一点?简而言之,我如何从cookie中放入和提取json数据?


8
只是学究,但您的问题中没有“ JSON数据”。您已经通过对象文字符号(不是JSON,JSON是对象文字符号的子集)定义了一些JavaScript对象,但是那里没有JSON。json.org不过,您几乎可以肯定希望使用 JSON作为数据格式来将对象存储在cookie字符串中。
TJ Crowder 2010年

Answers:


195

您可以将数据序列化为JSON,如下所示:

$.cookie("basket-data", JSON.stringify($("#ArticlesHolder").data()));

然后从cookie中获取它:

$("#ArticlesHolder").data(JSON.parse($.cookie("basket-data")));

这依赖于JSON.stringify()JSON.parse()序列化/反序列化您的数据对象,对于较旧的浏览器(IE <8),请包含json2.js以获得JSON功能。本示例使用jQuery cookie插件


2
自古以来my.opera.com/community/forums/…以来,Opera的cookie中都不允许使用JSON 。我也有此错误。即使@ cookie @插件使用@ encodeURIComponent @,pbug也不应出现。
kirilloid

1
这个问题和答案使我相信这cookie是jQuery中的内置函数。似乎不是。还是已弃用..?如果它是我找到的插件,那么链接到它来避免混乱将非常有用...
TJ 2014年

1
@TJ它确实是一个插件,即jQuery cookie插件。您可以在这里找到它:plugins.jquery.com/cookie我真的很想知道为什么它现在不在核心范围内……
Nick Craver

在某些浏览器中小心使用此功能。该,(逗号)字符会导致饼干不被内Safari和其他浏览器设置正确。
马特·西摩

如果不需要jQuery,您还可以使用这个出色的轻量级cookie库。[ developer.mozilla.org/zh-CN/docs/Web/API/document/cookie] lib
RyBolt's

40

现在已经不需要JSON.stringify显式使用。只需执行这一行代码

$.cookie.json = true;

之后,您可以将任何对象保存在cookie中,当读取cookie时,它将自动转换为JSON并从JSON返回。

var user = { name: "name", age: 25 }
$.cookie('user', user);
...

var currentUser = $.cookie('user');
alert('User name is ' + currentUser.name);

但是JSON库不是jquery.cookie附带的,因此您必须自己下载它,并在jquery.cookie.js之前包含到html页面中。


3
我在没有$ .cookie.json = true的情况下尝试了这种方法,并将[object object]作为我的cookie值。然后将其设置为true,并尝试将对象直接传递给cookie,并且没有cookie被填充。
2013年

@ jacobross85我认为我们当中有些人可能正在使用旧版本的jquery.cookie.js,请检查源代码,有时错误的文件处于活动状态。
德克斯特(Dexter)

请注意,这将导致Cookie被普遍视为JSON。因此,盲目添加$cookie.json = true可能会导致与其他Cookie发生冲突。因此,请小心在已在其他地方使用Cookie的项目中使用此功能!
Eric Tjossem

您对复杂的json有什么解决方案吗?我在json中有一个json数组,其中一些属性包含json和....
nasim jahednia 18-11-18

7

用于JSON.stringify(userData)将json对象覆盖。

var dataStore = $.cookie("basket-data", JSON.stringify($("#ArticlesHolder").data()));

并从cookie使用中恢复 JSON.parse()

var data=JSON.parse($.cookie("basket-data"))

4

将返回的值保存JSON.stringify(userData)到cookie中不是一个好习惯;它可能会导致某些浏览器中的错误。

在使用它之前,您应该将其转换为base64(使用btoa),并且在读取时,应将其从base64转换(使用atob)。

val = JSON.stringify(userData)
val = btoa(val)

write_cookie(val)

3
您是否有与此相关的浏览器参考?
Marthin

1
我在django平台上的chrome上使用json列表作为cookie。它有一些问题。同时,它总是更好地隐藏通过cookie从用户传递的实际数据
的Eyal章

1
在服务器端,Python的标准cookie处理将拒绝包含{或的cookie },并在cookie标头中静默删除跟随被拒绝cookie的所有cookie。
snakecharmerb

2

通过将数据序列化为JSON和Base64,依赖项jquery.cookie.js:

var putCookieObj = function(key, value) {
    $.cookie(key, btoa(JSON.stringify(value)));
}

var getCookieObj = function (key) {
    var cookie = $.cookie(key);
    if (typeof cookie === "undefined") return null;
    return JSON.parse(atob(cookie));
}

:)


0

试试这个:https : //github.com/tantau-horia/jquery-SuperCookie

快速用法:

创建-创建cookie

检查-检查存在

验证-验证cookie值是否为JSON

check_index-验证JSON中是否存在索引

read_values-将cookie值读取为字符串

read_JSON-将cookie值读取为JSON对象

read_value-读取存储在JSON对象中的索引的值

replace_value-替换存储在JSON对象中的指定索引中的值

remove_value-删除存储在JSON对象中的值和索引

只需使用:

$.super_cookie().create("name_of_the_cookie",name_field_1:"value1",name_field_2:"value2"});
$.super_cookie().read_json("name_of_the_cookie");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.