jquery บันทึกวัตถุข้อมูล json ในคุกกี้


108

ฉันจะบันทึกข้อมูล JSON ในคุกกี้ได้อย่างไร

ข้อมูล 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);
});

มีใครรู้บ้างว่าฉันมาถูกทางหรือควรทำด้วยวิธีอื่น พูดง่ายๆคือฉันจะใส่และดึงข้อมูล json จากคุกกี้ได้อย่างไร?


8
เป็นเพียงการอวดดี แต่ไม่มี "ข้อมูล JSON" ในคำถามของคุณ คุณมีออบเจ็กต์ JavaScript บางอย่างที่คุณกำหนดผ่านสัญกรณ์ตามตัวอักษรของออบเจ็กต์ (ไม่ใช่ JSON, JSON เป็นส่วนย่อยของสัญกรณ์ตามตัวอักษรของอ็อบเจ็กต์) แต่ไม่มี JSON ที่นั่น json.orgคุณเกือบจะต้องการใช้ JSON เป็นรูปแบบข้อมูลสำหรับการจัดเก็บวัตถุของคุณในสตริงคุกกี้
TJ Crowder

คำตอบ:


195

คุณสามารถจัดลำดับข้อมูลเป็น JSON ได้ดังนี้:

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

จากนั้นเพื่อรับมันจากคุกกี้:

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

สิ่งนี้อาศัยJSON.stringify()และJSON.parse()เพื่อทำให้เป็นซีเรียลไลซ์ / deserialize ออบเจ็กต์ข้อมูลของคุณสำหรับเบราว์เซอร์รุ่นเก่า (IE <8) รวมถึงjson2.jsเพื่อรับJSONฟังก์ชันการทำงาน ตัวอย่างนี้ใช้ปลั๊กอินคุกกี้ jQuery


2
ไม่อนุญาตให้ใช้ JSON ในคุกกี้ของ Opera ตั้งแต่สมัยโบราณmy.opera.com/community/forums/…ฉันก็มีข้อผิดพลาดนี้เช่นกัน แม้ว่าปลั๊กอิน @ cookie @ จะใช้ @ encodeURIComponent @ แต่ pbug ก็ไม่ควรปรากฏ
kirilloid

1
คำถามและคำตอบนี้ทำให้ฉันเชื่อว่าcookieเป็นฟังก์ชัน inbuilt ใน jQuery ดูเหมือนจะไม่ใช่ หรือเลิกใช้แล้ว .. ? หากเป็นปลั๊กอินที่ฉันพบการเชื่อมโยงไปยังจะเป็นการดีเพื่อหลีกเลี่ยงความสับสน ...
TJ

1
@TJ มันเป็นปลั๊กอินปลั๊กอินคุกกี้ jQuery คุณสามารถค้นหาได้ที่นี่: plugins.jquery.com/cookieฉันสงสัยจริงๆว่าทำไมมันถึงไม่อยู่ในจุดนี้ ...
Nick Craver

โปรดใช้ความระมัดระวังในบางเบราว์เซอร์ ,(จุลภาค) ตัวละครที่สามารถก่อให้เกิดคุกกี้จะไม่สามารถตั้งค่าอย่างถูกต้องภายใน Safari และเบราว์เซอร์อื่น ๆ
Matt Seymour

คุณยังสามารถใช้ไลบรารีคุกกี้น้ำหนักเบาที่ยอดเยี่ยมนี้ได้หากไม่ต้องการ jQuery [ developer.mozilla.org/en-US/docs/Web/API/document/cookie] lib
RyBolt

40

ตอนนี้ไม่จำเป็นต้องใช้JSON.stringifyอย่างชัดเจน เพียงรันโค้ดบรรทัดนี้

$.cookie.json = true;

หลังจากนั้นคุณสามารถบันทึกวัตถุใด ๆ ในคุกกี้ซึ่งจะถูกแปลงเป็น JSON โดยอัตโนมัติและกลับจาก JSON เมื่ออ่านคุกกี้

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

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

แต่ไลบรารี JSON ไม่ได้มาพร้อมกับ jquery.cookie ดังนั้นคุณต้องดาวน์โหลดด้วยตัวเองและรวมไว้ในหน้า html ก่อนjquery.cookie.js


3
ฉันลองใช้วิธีนี้โดยไม่มี $ .cookie.json = true และรับ [object object] เป็นค่าคุกกี้ของฉัน จากนั้นตั้งค่าเป็นจริงและพยายามส่งผ่านวัตถุไปยังคุกกี้โดยตรงและไม่มีการเติมคุกกี้
JacobRossDev

@ jacobross85 ฉันคิดว่าเป็นไปได้ที่พวกเราบางคนอาจใช้ jquery.cookie.js เวอร์ชันเก่ากว่าโปรดตรวจสอบซอร์สโค้ดบางครั้งไฟล์ที่ไม่ถูกต้องก็ทำงานอยู่
Dexter

โปรดทราบว่าสิ่งนี้จะทำให้คุกกี้ได้รับการปฏิบัติแบบสากลเป็น JSON ด้วยเหตุนี้การเพิ่มสุ่มสี่สุ่มห้า$cookie.json = trueอาจทำให้เกิดความขัดแย้งกับคุกกี้อื่น ๆ ของคุณ ดังนั้นโปรดใช้ความระมัดระวังในโครงการที่ใช้คุกกี้ที่อื่นอยู่แล้ว!
Eric Tjossem

คุณมีวิธีแก้ปัญหาสำหรับ json ที่ซับซ้อนหรือไม่? ฉันมีอาร์เรย์ json ใน json ของฉันซึ่งบางแอตทริบิวต์มี json และ ....
nasim jahednia

7

ใช้JSON.stringify(userData)เพื่อปกปิดวัตถุ json กับสตริง

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

และสำหรับการกลับมาจากการใช้คุกกี้ JSON.parse()

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

4

ไม่ใช่แนวปฏิบัติที่ดีในการบันทึกค่าที่ส่งคืนจากJSON.stringify(userData)ไปยังคุกกี้ อาจทำให้เกิดข้อบกพร่องในบางเบราว์เซอร์

ก่อนใช้งานคุณควรแปลงเป็นbase64 (โดยใช้btoa) และเมื่ออ่านแล้วให้แปลงจากbase64 (โดยใช้atob)

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

write_cookie(val)

3
คุณมีข้อมูลอ้างอิงถึงเบราว์เซอร์ที่มีปัญหากับสิ่งนี้หรือไม่?
Marthin

1
ฉันใช้รายการ jsons เป็นคุกกี้บน Chrome บนแพลตฟอร์ม django มันมีปัญหาบางอย่าง นอกจากนี้การซ่อนข้อมูลจริงที่ส่งผ่านคุกกี้จากผู้ใช้จะดีกว่าเสมอ
Eyal Ch

1
ในฝั่งเซิร์ฟเวอร์การจัดการคุกกี้มาตรฐานของ Python จะปฏิเสธคุกกี้ที่มี{หรือ}และปล่อยคุกกี้ที่ติดตามคุกกี้ที่ถูกปฏิเสธในส่วนหัวของคุกกี้โดยไม่แจ้ง
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

การใช้งานด่วน:

สร้าง - สร้างคุกกี้

ตรวจสอบ - ตรวจสอบการมีอยู่

ตรวจสอบ - ตรวจสอบค่าคุกกี้หาก JSON

check_index - ตรวจสอบว่ามีดัชนีใน JSON หรือไม่

read_values ​​- อ่านค่าคุกกี้เป็นสตริง

read_JSON - อ่านค่าคุกกี้เป็นออบเจ็กต์ 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");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.