JavaScriptオブジェクトをsessionStorageに保存する


152

SessionStorageとLocalStorageを使用すると、キーと値のペアをWebブラウザーに保存できます。値は文字列でなければならず、保存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'

defineGetterdefineSetterメソッドを使用して呼び出しをインターセプトしようとしましたが、すべてのプロパティを定義する必要があり、私の目標は将来のプロパティを知ることではないため、面倒な作業です。


1
私はそれを自分で考えました。多くの人が持っていると思います。しかし、getterメソッドとsetterメソッドはそれほど負担ではないと思います。ところで、JavaScriptを使用してシリアル化および解析することができ、MSは最終的に他のすべてのユーザーと同じ標準オブジェクトをサポートします。JSONやjQueryのようなパッケージの必要性の時代は急速に終わりを迎えています。
ロジャーF.ゲイ

1
制限がないようです。些細なオブジェクトしかない場合、JSON.stringifyとJSON.parseを使用するのはやり過ぎに見えるかもしれませんが、適切なサイズのデータ​​オブジェクトさえあれば、これらの2つのメソッドは多くの作業を行います。
Robusto 2013

5
「この制限を回避できますか?」質問のようです
sonicblis 2014年

1
制限があるかどうかにかかわらず、この質問は私が問題を解決するのに役立ちました。ありがとうございます。
Matt West

回答:


19

Web Storage APIが提供するアクセサーを使用することも、ラッパー/アダプターを作成することもできます。defineGetter / defineSetterに関するあなたの述べられた問題から、ラッパー/アダプターを書くことはあなたにとってあまりに多くの仕事のように聞こえます。

正直言って何を言えばいいのか分かりません。「おかしな制限」とは何かについてのあなたの意見を再評価できるかもしれません。Web Storage APIは、本来あるべき姿であるキー/バリューストアです。


8
「ばかげている」という不適切な言葉を使った場合は申し訳ありません。「とても面白いかもしれない」と置き換えてください。webStorageは新しいWebの最もエキサイティングな改善の1つだと思います。ただし、値のキーマップには文字列のみを保存してください。これは制限だと思います。クッキーの続編のようです。StorageはJavaScript言語だけでなく、オブジェクトのシリアライズが興味深い改善になる仕様であることは知っています。どう思いますか?
Ferran Basora 2011年

2
JSONでは不十分な場合は、常に独自のオブジェクトシリアル化メソッドを作成できます。
ライアンオールズ

110

オブジェクトを「文字sessionStorage.setItem()列化」できませんか?次に、オブジェクトのその文字列表現を格納するために使用します...次に、それが必要なときsessionStorage.getItem()にそれを使用$.parseJSON()して戻すことができますか?

動作例http://jsfiddle.net/pKXMa/


これは私にとってはうまくいきます。$ .parseJSON()を呼び出した後、動作するJsonオブジェクトを取得します
Olafur Tryggvason

Web API認証のような一部のシステムは、「stringify」を実行する必要があるObject {propertyOneWithoutQuotes: "<value1>"、... propertyNWithoutQuotes: "<valueN>"}の形式でオブジェクトを返します。複数のソースがある場合は、stringifyを使用してデータを標準化することをお勧めします。
エルガブ2015年

これは非常に良い答えです。JSON.stringify()を使用してオブジェクトをシリアル化し、sessionStorageに保存することをお勧めします。次に、$。parseJSON()を使用して文字列を逆シリアル化し、オブジェクトを取得します。
Thomas.Benz、2016

102

解決策は、sessionStorageでsetItemを呼び出す前にオブジェクトを文字列化することです。

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

ソリューションをリンクしないでいただきありがとうございます
Luc-Olsthoorn

12

これは、オブジェクトを含むすべての値タイプで機能する動的ソリューションです。

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

5

使用事例:

 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
JavaScriptのベストプラクティスの1つは、自分が所有していないオブジェクトのプロトタイプを作成しないことだと思いました。Storage.prototype.setObjの使用は悪い考えのようです。
ブリッツトファー、2015年

3
そして、もっぱらそれに依存している- -ちょうど義務を追加...あなたは、このプロトタイプのコードを追加しない作る最初のチェックせずにストレージのブラウザがサポートしている場合:if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
JoeBrockhaus

4

ページのリロード後に再構築できない関数リテラル(読み取りクロージャ)が含まれている可能性があるため、セッションストレージは任意のオブジェクトをサポートできません。



2

クロスブラウザ機能を備えたストアライブラリを使用することもできます。

例:

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

セッションストレージからオブジェクトを保存および取得するための2つのラッパーメソッドを作成できます。

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

これを次のように使用します。-オブジェクトを取得し、一部のデータを変更して、保存し直します。

var obj = getSession();

obj.newProperty = "Prod"

saveSession(obj);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.