jquery salva l'oggetto dati json nel cookie


108

Come si salvano i dati JSON in un cookie?

I miei dati JSON hanno questo aspetto

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

E voglio fare qualcosa di simile

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

e per recuperare i dati in cui voglio caricarli $("#ArticlesHolder")come

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

qualcuno sa se sono sulla strada giusta o dovrebbe essere fatto in qualche altro modo? In poche parole, come faccio a inserire e estrarre dati JSON da un cookie?


8
Sono solo pedante, ma non ci sono "dati JSON" nella tua domanda. Hai alcuni oggetti JavaScript che hai definito tramite la notazione letterale oggetto (non JSON, JSON è un sottoinsieme della notazione letterale oggetto), ma non c'è JSON lì. json.org Quasi certamente vorrai usare JSON come formato dati per memorizzare i tuoi oggetti nella stringa del cookie, però.
TJ Crowder

Risposte:


195

Puoi serializzare i dati come JSON, in questo modo:

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

Quindi per ottenerlo dal cookie:

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

Questo si basa su JSON.stringify()eJSON.parse() per serializzare / deserializzare l'oggetto dati, per i browser meno recenti (IE <8) includere json2.js per ottenere la JSONfunzionalità. Questo esempio utilizza il plugin cookie jQuery


2
JSON non è consentito nei cookie per Opera sin dai tempi antichi my.opera.com/community/forums/… Ho anche questo errore. Anche se @ cookie @ plugin usa @ encodeURIComponent @, pbug non dovrebbe apparire.
kirilloid

1
Questa domanda e risposta mi portano a credere che cookiesia una funzione incorporata in jQuery. Sembra che non lo sia. o è deprecato ..? se sono i plugin che trovo, collegarsi ad esso sarebbe fantastico per evitare confusione ...
TJ

1
@TJ È davvero un plugin, il plugin cookie jQuery. Puoi trovarlo qui: plugins.jquery.com/cookie Mi chiedo davvero perché non è nel core a questo punto ...
Nick Craver

Fai attenzione a usarlo in alcuni browser. Il carattere ,(virgola) può causare la mancata impostazione dei cookie in Safari e altri browser.
Matt Seymour

Puoi anche usare questa fantastica libreria di cookie leggera se jQuery non è desiderato. [ developer.mozilla.org/en-US/docs/Web/API/document/cookie] lib
RyBolt

40

Ora non è già necessario utilizzare JSON.stringifyesplicitamente. Basta eseguire questa riga di codice

$.cookie.json = true;

Dopodiché puoi salvare qualsiasi oggetto nel cookie, che verrà automaticamente convertito in JSON e di nuovo da JSON durante la lettura del cookie.

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

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

Ma la libreria JSON non viene fornita con jquery.cookie, quindi devi scaricarla da solo e includerla nella pagina html prima di jquery.cookie.js


3
Ho provato questo approccio senza $ .cookie.json = true e ho ottenuto [oggetto oggetto] come valore del cookie. Quindi impostarlo su true e provare a passare l'oggetto direttamente al cookie e nessun cookie è stato popolato.
JacobRossDev

@ jacobross85 Penso che sia possibile che alcuni di noi stiano utilizzando una versione precedente di jquery.cookie.js, controlla il codice sorgente, a volte è attivo il file sbagliato.
Dexter

Tieni presente che ciò farà sì che i cookie vengano universalmente trattati come JSON. Di conseguenza, l'aggiunta cieca $cookie.json = truepuò causare conflitti con gli altri cookie. Quindi fai attenzione a usarlo su un progetto che utilizza già i cookie altrove!
Eric Tjossem

avete qualche soluzione per json complesso? ho un array json nel mio json che alcuni attributi contengono json e ....
nasim jahednia

7

utilizzare JSON.stringify(userData)per coprire l'oggetto json da stringere.

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

e per tornare indietro dall'uso dei cookie JSON.parse()

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

4

Non è buona norma salvare il valore restituito da JSON.stringify(userData)un cookie; può portare a un bug in alcuni browser.

Prima di usarlo, dovresti convertirlo in base64 (usando btoa) e durante la lettura, convertirlo da base64 (usando atob).

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

write_cookie(val)

3
Hai un riferimento a un browser che ha problemi con questo?
Marthin

1
io uso un elenco di json come cookie su Chrome sulla piattaforma django. ha alcuni problemi. inoltre, è sempre meglio nascondere all'utente i dati effettivi passati dal cookie
Eyal Ch

1
Sul lato server, la gestione dei cookie standard di Python rifiuterà i cookie contenenti {o }e rilascerà silenziosamente tutti i cookie che seguono il cookie rifiutato nell'intestazione del cookie.
snakecharmerb

2

Con serializzare i dati come JSON e Base64, dipendenza 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

Prova questo: https://github.com/tantau-horia/jquery-SuperCookie

Utilizzo rapido:

creare - creare cookie

check - controlla l'esistenza

verifica: verifica il valore del cookie se JSON

check_index: verifica se l'indice esiste in JSON

read_values ​​- legge il valore del cookie come stringa

read_JSON - legge il valore del cookie come oggetto JSON

read_value - legge il valore dell'indice memorizzato nell'oggetto JSON

sostituire_valore: sostituire il valore da un indice specificato memorizzato nell'oggetto JSON

remove_value: rimuove il valore e l'indice memorizzati nell'oggetto JSON

Usa solo:

$.super_cookie().create("name_of_the_cookie",name_field_1:"value1",name_field_2:"value2"});
$.super_cookie().read_json("name_of_the_cookie");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.