Salva oggetti Javascript in sessionStorage


152

SessionStorage e LocalStorage consente di salvare coppie chiave / valore in un browser Web. Il valore deve essere una stringa e il salvataggio di oggetti js non è banale.

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

Al giorno d'oggi, è possibile evitare questa limitazione serializzando gli oggetti su JSON e quindi deserializzandoli per ripristinare gli oggetti. Ma l'API di archiviazione passa sempre attraverso i metodi setIteme getItem.

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

Posso evitare questa limitazione?

Voglio solo eseguire qualcosa del genere:

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

Ho provato i metodi defineGettere defineSetterper intercettare le chiamate ma è un lavoro noioso, perché devo definire tutte le proprietà e il mio obiettivo non è conoscere le proprietà future.


1
Ci ho pensato anch'io. Suppongo che molte persone abbiano. Ma non credo che i metodi getter e setter siano troppo onerosi. BTW; puoi serializzare e analizzare con JavaScript e MS supporta finalmente gli stessi oggetti standard di tutti gli altri. I giorni di necessità di pacchetti come JSON e jQuery stanno rapidamente volgendo al termine.
Roger F. Gay,

1
Immagino di non vedere il limite. Può sembrare eccessivo usare JSON.stringify e JSON.parse se hai sempre oggetti banali, ma se hai anche oggetti dati di buone dimensioni quei due metodi stanno facendo molto lavoro per te.
Robusto,

5
"Posso evitare questa limitazione?" sembra una domanda
sonicblis,

1
Bene limitazione o no, questa domanda mi ha aiutato a risolvere un problema, quindi grazie.
Matt West,

Risposte:


19

È possibile utilizzare gli accessori forniti dall'API di archiviazione Web oppure scrivere un wrapper / adattatore. Dal tuo problema dichiarato con defineGetter / defineSetter sembra che scrivere un wrapper / adattatore sia troppo lavoro per te.

Onestamente non so cosa dirti. Forse potresti rivalutare la tua opinione su ciò che è una "limitazione ridicola". L'API di archiviazione Web è proprio quello che dovrebbe essere, un archivio chiave / valore.


8
Scusate se ho usato una parola inappropriata con "ridicolo". Sostituiscilo con "potrebbe essere così interessante". Penso che il WebStorage sia uno dei miglioramenti più interessanti del nuovo web. Ma salva solo le stringhe nella key-map del valore che penso sia una limitazione. Sembra un sequel di biscotti. So che l'archiviazione è una specifica non solo per il linguaggio Javascript, ma serializzare gli oggetti potrebbe essere un miglioramento interessante. Cosa ne pensi?
Ferran Basora,

2
Se JSON non è sufficiente, è sempre possibile scrivere i propri metodi di serializzazione degli oggetti.
Ryan Olds,

110

Non potresti 'stringere' il tuo oggetto ... quindi utilizzare sessionStorage.setItem()per memorizzare quella rappresentazione in stringa del tuo oggetto ... quindi quando ne hai bisogno sessionStorage.getItem()e poi usare$.parseJSON() per rimetterlo fuori?

Esempio di lavoro http://jsfiddle.net/pKXMa/


Questo funziona per me. Ottengo un oggetto Json funzionante dopo aver chiamato $ .parseJSON ()
Olafur Tryggvason

Alcuni sistemi come l'autenticazione Web Api restituiscono oggetti sotto forma di Object {propertyOneWithoutQuotes: "<value1>", ... propertyNWithoutQuotes: "<valueN>"} che devono passare attraverso "stringify". Se ci sono più fonti, potrebbe essere meglio usare stringify per standardizzare i dati.
Jelgab,

Questa è un'ottima risposta. È utile utilizzare JSON.stringify () per serializzare l'oggetto e archiviarlo in sessionStorage. Quindi, utilizza $ .parseJSON () per deserializzare la stringa per ottenere l'oggetto.
Thomas.Benz,

102

La soluzione è di stringere l'oggetto prima di chiamare setItem su sessionStorage.

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

Grazie per non aver collegato la soluzione
Luc-Olsthoorn,

12

Questa è una soluzione dinamica che funziona con tutti i tipi di valore inclusi gli oggetti:

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;
    }
  }
}

Poi :

const session = new Session();

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

5

Caso d'uso:

 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))
    };

4
Ho pensato che una delle migliori pratiche in JavaScript fosse quella di non prototipare oggetti che non possiedi. L'uso di Storage.prototype.setObj sembra una cattiva idea.
Britztopher,

3
semplicemente aggiungendo l'obbligatorio .. assicurati di non aggiungere questo prototipo di codice - e affidati esclusivamente ad esso - senza prima verificare se il browser lo supporta Memoria:if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
JoeBrockhaus

4

L'archiviazione della sessione non può supportare un oggetto arbitrario perché può contenere valori letterali di funzione (chiusure di lettura) che non possono essere ricostruiti dopo il ricaricamento di una pagina.


3
    var user = {'name':'John'};
    sessionStorage['user'] = JSON.stringify(user);
    console.log(sessionStorage['user']);

2

Puoi anche usare la libreria del negozio che la esegue per te con l'abilità crossbrowser.

esempio :

// Store current user
store.set('user', { name:'Marcus' })

// Get current user
store.get('user')

// Remove current user
store.remove('user')

// Clear all keys
store.clearAll()

// Loop over all stored values
store.each(function(value, key) {
    console.log(key, '==', value)
})

0

È possibile creare 2 metodi wrapper per il salvataggio e il recupero di oggetti dalla memoria di sessione.

function saveSession(obj) {
  sessionStorage.setItem("myObj", JSON.stringify(obj));
  return true;
}

function getSession() {
  var obj = {};
  if (typeof sessionStorage.myObj !== "undefined") {
    obj = JSON.parse(sessionStorage.myObj);
  }
  return obj;
}

Usalo in questo modo: - Ottieni oggetto, modifica alcuni dati e salva.

var obj = getSession();

obj.newProperty = "Prod"

saveSession(obj);
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.