Сохранение объектов Javascript в sessionStorage

SessionStorage и localStorage позволяет сохранять пары ключ/значение в веб-браузере. Значение должно быть строкой, а сохранение объектов js не является тривиальным.

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

в настоящее время вы можете избежать этого ограничения путем сериализации объектов в JSON, а затем десериализации их для восстановления объектов. Но API хранения всегда проходит через setItem и getItem методы.

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

могу ли я избежать этого ограничения?

Я просто хочу, чтобы выполнить что-то вроде это:

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

Я пробовал defineGetter и defineSetter методы для перехвата вызовов, но его утомительная работа, потому что я должен определить все свойства, и моя цель не знать будущих свойств.

8 ответов


либо вы можете использовать аксессоры, предоставляемые API веб-хранилища, либо вы можете написать оболочку/адаптер. Из вашей заявленной проблемы с defineGetter / defineSetter звучит так, как написание оболочки/адаптера слишком много работы для вас.

Я честно не знаю, что вам сказать. Возможно, вы могли бы пересмотреть свое мнение о том, что такое "смешное ограничение". API веб-хранилища-это именно то, что должно быть, хранилище ключей/значений.


не могли бы вы "stringify" ваш объект...тогда используйте sessionStorage.setItem() сохранить строковое представление объекта...тогда, когда вам это нужно sessionStorage.getItem() и затем использовать $.parseJSON() чтобы получить его обратно?

рабочий пример http://jsfiddle.net/pKXMa/


решение состоит в том, чтобы stringify объект перед вызовом setItem на sessionStorage.

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

это динамическое решение, которое работает со всеми типами значения, включая объекты :

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

затем :

const session = new Session();

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

использовать случае:

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

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

хранилище сеансов не может поддерживать произвольный объект, поскольку оно может содержать литералы функций (замыкания чтения), которые не могут быть восстановлены после перезагрузки страницы.


вы также можете использовать библиотека магазин который выполняет его для вас с возможностью crossbrowser.

пример :

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