190 votes

Sauvegarder les objets Javascript dans le sessionStorage

SessionStorage et LocalStorage permettent de sauvegarder des paires clé/valeur dans un navigateur web. La valeur doit être une chaîne de caractères, et la sauvegarde des objets js n'est pas triviale.

var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object

De nos jours, vous pouvez éviter cette limitation en sérialisant les objets en JSON, puis en les désérialisant pour récupérer les objets. Mais l'API de stockage passe toujours par le setItem y getItem méthodes.

sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D

Puis-je éviter cette limitation ?

Je veux juste exécuter quelque chose comme ça :

sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'

J'ai essayé le defineGetter y defineSetter pour intercepter les appels mais c'est un travail fastidieux, car je dois définir toutes les propriétés et mon objectif n'est pas de connaître les propriétés futures.

1 votes

J'y ai pensé moi-même. Je suppose que beaucoup de gens y ont pensé. Mais je ne pense pas que les méthodes getter et setter soient un fardeau trop lourd. BTW ; vous pouvez sérialiser et parser avec JavaScript et MS supporte enfin les mêmes objets standards que tout le monde. L'époque où l'on avait besoin de paquets comme JSON et jQuery touche rapidement à sa fin.

1 votes

Je suppose que je ne vois pas la limitation. Il peut sembler exagéré d'utiliser JSON.stringify et JSON.parse si vous n'avez que des objets triviaux, mais si vous avez des objets de données de bonne taille, ces deux méthodes font beaucoup de travail pour vous.

5 votes

"Puis-je éviter cette limitation ?" semble être une question

150voto

Ron Points 978

La solution consiste à texturer l'objet avant d'appeler setItem sur le sessionStorage.

var user = {'name':'John'};
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.user);

117voto

afreeland Points 926

Ne pourriez-vous pas " stringifier " votre objet... puis utiliser sessionStorage.setItem() pour stocker la représentation en chaîne de votre objet... et quand vous en avez besoin sessionStorage.getItem() et ensuite utiliser $.parseJSON() pour le faire ressortir ?

Exemple de travail http://jsfiddle.net/pKXMa/

0 votes

Cela fonctionne pour moi. J'obtiens un objet Json fonctionnel après avoir appelé $.parseJSON().

0 votes

Certains systèmes comme l'authentification Web Api renvoient des objets sous la forme Object { propertyOneWithoutQuotes : "<valeur1>", ... propertyNWithoutQuotes : "<valeurN>" } qui doivent passer par "stringify". S'il y a plusieurs sources, il peut être préférable d'utiliser "stringify" pour standardiser les données.

0 votes

C'est une très bonne réponse. Il est bon d'utiliser JSON.stringify() pour sérialiser l'objet et le stocker dans sessionStorage. Ensuite, il faut utiliser $.parseJSON() pour désérialiser la chaîne et récupérer l'objet.

23voto

Ryan Olds Points 3022

Vous pouvez soit utiliser les accesseurs fournis par l'API de stockage Web, soit écrire un wrapper/adaptateur. D'après le problème que vous avez rencontré avec defineGetter/defineSetter, il semble que l'écriture d'un wrapper/adaptateur représente trop de travail pour vous.

Honnêtement, je ne sais pas quoi vous dire. Peut-être pourriez-vous réévaluer votre opinion sur ce qu'est une "limitation ridicule". L'API de stockage Web est exactement ce qu'elle est censée être, un magasin de clés/valeurs.

10 votes

Désolé si j'ai utilisé un mot inapproprié avec "ridicule". Remplacez-le par "pourrait être très intéressant". Je pense que le webStorage est l'une des améliorations les plus intéressantes du nouveau web. Mais ne sauvegarder que des chaînes de caractères dans le key-map de la valeur est, je pense, une limitation. Cela ressemble à une suite de cookies. Je sais que le stockage est une spécification non seulement pour le langage Javascript, mais la sérialisation des objets pourrait être une amélioration intéressante. Qu'en pensez-vous ?

2 votes

Si JSON ne suffit pas, vous pouvez toujours écrire vos propres méthodes de sérialisation des objets.

19voto

Il s'agit d'une solution dynamique qui fonctionne avec tous les types de valeurs, y compris les objets :

class Session extends Map {
  set(id, value) {
    if (typeof value === 'object') value = JSON.stringify(value);
    sessionStorage.setItem(id, value);
  }

  get(id) {
    const value = sessionStorage.getItem(id);
    try {
      return JSON.parse(value);
    } catch (e) {
      return value;
    }
  }
}

Ensuite :

const session = new Session();

session.set('name', {first: 'Ahmed', last : 'Toumi'});
session.get('name');

6voto

Cas d'utilisation :

 sesssionStorage.setObj(1,{date:Date.now(),action:'save firstObject'});
 sesssionStorage.setObj(2,{date:Date.now(),action:'save 2nd object'}); 
 //Query first object
  sesssionStorage.getObj(1)
  //Retrieve date created of 2nd object
  new Date(sesssionStorage.getObj(1).date)

API

Storage.prototype.setObj = function(key, obj) {

        return this.setItem(key, JSON.stringify(obj))
    };

    Storage.prototype.getObj = function(key) {
        return JSON.parse(this.getItem(key))
    };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X