jquery guardar objeto de datos json en cookie

108

¿Cómo guardo datos JSON en una cookie?

Mis datos JSON se ven así

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

Y quiero hacer algo como

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

y para recuperar los datos quiero cargarlos en $("#ArticlesHolder")like

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

¿Alguien sabe si estoy en el camino correcto o debería hacerse de otra manera? En pocas palabras, ¿cómo coloco y extraigo datos json de una cookie?

Marthin
fuente
8
Simplemente siendo pedante, pero no hay "datos JSON" en su pregunta. Tiene algunos objetos JavaScript que ha definido a través de la notación literal de objeto (no JSON, JSON es un subconjunto de la notación literal de objeto), pero no hay JSON allí. json.org Sin embargo, es casi seguro que desee utilizar JSON como formato de datos para almacenar sus objetos en la cadena de cookies.
TJ Crowder

Respuestas:

195

Puede serializar los datos como JSON, así:

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

Luego, para obtenerlo de la cookie:

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

Esto se basa en JSON.stringify()yJSON.parse() para serializar / deserializar su objeto de datos, para los navegadores más antiguos (IE <8) se incluye json2.js para obtener la JSONfuncionalidad. Este ejemplo usa el complemento de cookies jQuery

Nick Craver
fuente
2
JSON no está permitido en las cookies de Opera desde la antigüedad my.opera.com/community/forums/… También tengo este error. Aunque si el complemento @ cookie @ usa @ encodeURIComponent @, pbug no debería aparecer.
kirilloid
1
Esta pregunta y respuesta me llevan a creer que cookiees una función incorporada en jQuery. Parece que no. o está en desuso ..? si son los complementos que encuentro, vincularlos sería genial para evitar la confusión ...
TJ
1
@TJ De hecho, es un complemento, el complemento de cookies de jQuery. Puede encontrarlo aquí: plugins.jquery.com/cookie Realmente me pregunto por qué no está en el núcleo en este momento ...
Nick Craver
Tenga cuidado al usar esto en algunos navegadores. El carácter ,(coma) puede hacer que las cookies no se establezcan correctamente en safari y otros navegadores.
Matt Seymour
También puede utilizar esta gran biblioteca de cookies ligeras si no se desea jQuery. [ developer.mozilla.org/en-US/docs/Web/API/document/cookie] lib
RyBolt
40

Ahora ya no es necesario utilizarlo JSON.stringifyexplícitamente. Simplemente ejecute esta línea de código

$.cookie.json = true;

Después de eso, puede guardar cualquier objeto en la cookie, que se convertirá automáticamente a JSON y volverá de JSON al leer la cookie.

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

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

Pero la biblioteca JSON no viene con jquery.cookie, por lo que debe descargarla usted mismo e incluirla en la página html antes de jquery.cookie.js

Vitalii Korsakov
fuente
3
Probé este enfoque sin $ .cookie.json = true y obtuve [object object] como mi valor de cookie. Luego configúrelo en verdadero e intentó pasar el objeto directamente a la cookie y no se completó ninguna cookie.
JacobRossDev
@ jacobross85 Creo que es posible que algunos de nosotros estemos usando una versión anterior de jquery.cookie.js, verifique el código fuente, a veces el archivo incorrecto está activo.
Dexter
Tenga en cuenta que esto hará que las cookies se traten universalmente como JSON. Como resultado, agregar a ciegas $cookie.json = truepuede causar conflictos con sus otras cookies. ¡Así que tenga cuidado al usar esto en un proyecto que ya usa cookies en otros lugares!
Eric Tjossem
¿Tiene alguna solución para json complejo? tengo una matriz json en mi json que algunos atributos contienen json y ....
nasim jahednia
7

utilizar JSON.stringify(userData)para coverty json object to string.

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

y para recuperarse del uso de cookies JSON.parse()

var data=JSON.parse($.cookie("basket-data"))
X Men
fuente
4

No es una buena práctica guardar el valor que se devuelve JSON.stringify(userData)en una cookie; puede provocar un error en algunos navegadores.

Antes de usarlo, debe convertirlo a base64 (usando btoa), y al leerlo, convertirlo de base64 (usando atob).

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

write_cookie(val)
Eyal Ch
fuente
3
¿Tiene una referencia a un navegador que tiene problemas con esto?
Marthin
1
Utilizo una lista de jsons como cookie en Chrome en la plataforma django. tiene algunos problemas. Además, siempre es mejor ocultar al usuario los datos reales transmitidos por la cookie
Eyal Ch
1
En el lado del servidor, el manejo de cookies estándar de Python rechazará las cookies que contengan {o }, y eliminará silenciosamente cualquier cookie que siga a la cookie rechazada en el encabezado de la cookie.
snakecharmerb
2

Con serializar los datos como JSON y Base64, dependencia 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));
}

:)

asimov
fuente
0

Prueba este: https://github.com/tantau-horia/jquery-SuperCookie

Uso rápido:

crear - crear cookie

comprobar - comprobar la existencia

verificar: verificar el valor de la cookie si es JSON

check_index: verifica si el índice existe en JSON

read_values ​​- lee el valor de la cookie como una cadena

read_JSON - lee el valor de la cookie como un objeto JSON

read_value - valor de lectura del índice almacenado en el objeto JSON

replace_value: reemplaza el valor de un índice especificado almacenado en el objeto JSON

remove_value: elimina el valor y el índice almacenados en el objeto JSON

Solo usa:

$.super_cookie().create("name_of_the_cookie",name_field_1:"value1",name_field_2:"value2"});
$.super_cookie().read_json("name_of_the_cookie");
uzername_not_found
fuente