jquery lưu đối tượng dữ liệu json trong cookie


108

Làm cách nào để lưu dữ liệu JSON trong cookie?

Dữ liệu JSON của tôi trông như thế này

$("#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'});

Và tôi muốn làm một cái gì đó như

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

và để truy xuất dữ liệu tôi muốn tải nó vào $("#ArticlesHolder")như

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

không ai biết nếu tôi đang đi đúng hướng hoặc điều này nên được thực hiện theo một số cách khác? Nói một cách đơn giản, làm cách nào để đặt và lấy dữ liệu json từ cookie?


8
Chỉ mang tính ngôn ngữ, nhưng không có "dữ liệu JSON" nào trong câu hỏi của bạn. Bạn có một số đối tượng JavaScript mà bạn đã xác định thông qua ký hiệu chữ đối tượng (không phải JSON, JSON là một tập con của ký hiệu chữ đối tượng), nhưng không có JSON ở đó. json.org Tuy nhiên, bạn gần như chắc chắn muốn sử dụng JSON làm định dạng dữ liệu để lưu trữ các đối tượng của bạn trong chuỗi cookie.
TJ Crowder

Câu trả lời:


195

Bạn có thể tuần tự hóa dữ liệu dưới dạng JSON, như sau:

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

Sau đó, để lấy nó từ cookie:

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

Điều này dựa vào JSON.stringify()JSON.parse() để tuần tự hóa / giải mã hóa đối tượng dữ liệu của bạn, đối với các trình duyệt cũ hơn (IE <8), hãy bao gồm json2.js để có được JSONchức năng. Ví dụ này sử dụng plugin cookie jQuery


2
JSON không được phép trong cookie cho Opera từ thời cổ đại my.opera.com/community/forums/… Tôi cũng gặp lỗi này. Mặc dù nếu plugin @ cookie @ sử dụng @ encodeURIComponent @, pbug sẽ không xuất hiện.
kirilloid

1
Câu hỏi và câu trả lời này khiến tôi tin rằng đó cookielà một hàm có sẵn trong jQuery. Có vẻ như không phải vậy. hoặc là nó không được chấp nhận ..? nếu nó là plugin tôi thấy, liên kết đến nó sẽ là tuyệt vời để tránh sự nhầm lẫn ...
TJ

1
@TJ Nó thực sự là một plugin, plugin cookie jQuery. Bạn có thể tìm thấy nó ở đây: plugins.jquery.com/cookie Tôi thực sự tự hỏi tại sao nó không nằm trong cốt lõi vào thời điểm này ...
Nick Craver

Hãy cẩn thận khi sử dụng điều này trong một số trình duyệt. Ký tự ,(dấu phẩy) có thể khiến cookie không được đặt chính xác trong safari và các trình duyệt khác.
Matt Seymour

Bạn cũng có thể sử dụng thư viện cookie nhẹ tuyệt vời này nếu không muốn sử dụng jQuery. [ developer.mozilla.org/en-US/docs/Web/API/document/cookie] lib
RyBolt

40

Bây giờ không cần phải sử dụng JSON.stringifymột cách rõ ràng. Chỉ cần thực thi dòng mã này

$.cookie.json = true;

Sau đó, bạn có thể lưu bất kỳ đối tượng nào trong cookie, đối tượng này sẽ được tự động chuyển đổi thành JSON và trở lại từ JSON khi đọc cookie.

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

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

Nhưng thư viện JSON không đi kèm với jquery.cookie, vì vậy bạn phải tự tải xuống và đưa vào trang html trước jquery.cookie.js


3
Tôi đã thử phương pháp này mà không có $ .cookie.json = true và lấy [đối tượng đối tượng] làm giá trị cookie của mình. Sau đó, đặt nó thành true và cố gắng chuyển đối tượng trực tiếp đến cookie và không có cookie nào được điền.
JacobRossDev

@ jacobross85 Tôi nghĩ rằng có thể một số người trong chúng ta đang sử dụng phiên bản cũ hơn của jquery.cookie.js, vui lòng kiểm tra mã nguồn, đôi khi tệp hoạt động sai.
Dexter

Xin lưu ý rằng điều này sẽ khiến cookie được coi là JSON trên toàn cầu. Do đó, việc thêm một cách mù quáng $cookie.json = truecó thể gây ra xung đột với các cookie khác của bạn. Vì vậy, hãy cẩn thận khi sử dụng nó trên một dự án đã sử dụng cookie ở nơi khác!
Eric Tjossem

bạn có giải pháp nào cho json phức tạp không? tôi có một mảng json theo json của tôi mà một số thuộc tính chứa json và ....
jahednia Nasim

7

sử dụng JSON.stringify(userData)đối tượng json bí mật thành chuỗi.

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

và để lấy lại từ việc sử dụng cookie JSON.parse()

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

4

Việc lưu giá trị được trả về từ JSON.stringify(userData)một cookie là không tốt ; nó có thể dẫn đến lỗi trong một số trình duyệt.

Trước khi sử dụng nó, bạn nên chuyển nó sang base64 (using btoa), và khi đọc nó, hãy chuyển đổi từ base64 (using atob).

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

write_cookie(val)

3
Bạn có tham chiếu đến trình duyệt gặp sự cố với điều này không?
Marthin

1
tôi sử dụng danh sách json làm cookie trên chrome trên nền tảng django. nó có một số vấn đề. Ngoài ra, tốt hơn hết là bạn nên ẩn dữ liệu thực tế được cookie chuyển từ người dùng
Eyal Ch

1
Về phía máy chủ, xử lý cookie tiêu chuẩn của Python sẽ từ chối các cookie có chứa {hoặc }và âm thầm loại bỏ bất kỳ cookie nào theo sau cookie bị từ chối trong tiêu đề cookie.
snakecharmerb

2

Với việc tuần tự hóa dữ liệu dưới dạng JSON và Base64, phụ thuộc 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

Hãy thử cái này: https://github.com/tantau-horia/jquery-SuperCookie

Sử dụng nhanh:

tạo - tạo cookie

kiểm tra - kiểm tra sự tồn tại

xác minh - xác minh giá trị cookie nếu JSON

check_index - xác minh xem chỉ mục có tồn tại trong JSON không

read_values ​​- đọc giá trị cookie dưới dạng chuỗi

read_JSON - đọc giá trị cookie dưới dạng đối tượng JSON

read_value - giá trị đọc của chỉ mục được lưu trữ trong đối tượng JSON

Replace_value - thay thế giá trị từ một chỉ mục được chỉ định được lưu trữ trong đối tượng JSON

remove_value - xóa giá trị và chỉ mục được lưu trữ trong đối tượng JSON

Chỉ dùng:

$.super_cookie().create("name_of_the_cookie",name_field_1:"value1",name_field_2:"value2"});
$.super_cookie().read_json("name_of_the_cookie");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.