sessionStorage에 자바 스크립트 객체 저장


152

SessionStorage 및 LocalStorage를 사용하면 웹 브라우저에 키 / 값 쌍을 저장할 수 있습니다. 값은 문자열이어야하며 js 객체 저장은 사소한 것이 아닙니다.

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

요즘에는 객체를 JSON으로 직렬화 한 다음 역 직렬화하여 객체를 복구하여 이러한 제한을 피할 수 있습니다. 그러나 스토리지 API는 항상 setItemand 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'

모든 속성을 정의해야하며 대상이 미래 속성을 알지 못하기 때문에 호출을 가로 채기 위해 defineGetterand defineSetter메소드를 시도했지만 지루한 작업이었습니다.


1
나는 그것을 스스로 생각했다. 많은 사람들이 가지고 있다고 생각합니다. 그러나 getter 및 setter 메소드가 너무 많은 부담이 아니라고 생각합니다. BTW; JavaScript를 사용하여 직렬화 및 구문 분석 할 수 있으며 MS는 다른 모든 사용자와 동일한 표준 객체를 지원합니다. JSON 및 jQuery와 같은 패키지가 필요했던 시대는 빠르게 끝났습니다.
Roger F. Gay

1
제한이 보이지 않는 것 같습니다. 사소한 객체 만있는 경우 JSON.stringify 및 JSON.parse를 사용하는 것은 과도하게 보일 수 있지만 크기가 큰 데이터 객체가있는 경우이 두 가지 방법으로 많은 작업을 수행 할 수 있습니다.
부스 토

5
"이 제한을 피할 수 있습니까?" 질문처럼 보입니다
sonicblis 2016 년

1
제한이 있든 없든,이 질문은 문제를 해결하는 데 도움이되었으므로 감사합니다.
Matt West

답변:


19

Web Storage API에서 제공 한 접근자를 사용하거나 랩퍼 / 어댑터를 작성할 수 있습니다. defineGetter / defineSetter에 대해 언급 한 문제에서 래퍼 / 어댑터를 작성하는 것이 너무 효과적입니다.

솔직히 당신에게 무엇을 말해야할지 모르겠습니다. 어쩌면 당신은 "말도 안되는 한계"에 대한 당신의 의견을 재평가 할 수있을 것입니다. Web Storage API는 키 / 값 저장소로되어 있습니다.


8
'말도 안되는'이라는 부적절한 단어를 사용한 경우 죄송합니다. '너무 재미있을 수 있습니다'로 바꾸십시오. webStorage는 새로운 웹에서 가장 흥미로운 개선 중 하나라고 생각합니다. 그러나 가치 키 맵에 문자열 만 저장하면 제한 사항이라고 생각합니다. 쿠키 속편 인 것 같습니다. 스토리지는 Javascript 언어 전용 사양이 아니라 객체 직렬화가 흥미로운 개선 사항이라는 것을 알고 있습니다. 어떻게 생각해?
Ferran Basora 2016 년

2
JSON으로 충분하지 않은 경우 언제든지 자체 객체 직렬화 메소드를 작성할 수 있습니다.
Ryan Olds

110

객체를 ' sessionStorage.setItem()문자열 화' 할 수 없습니까? 그런 다음 객체의 문자열 표현을 저장하는 데 사용할 수 있습니다. 그러면 필요할 때 다시 가져 오는 데 sessionStorage.getItem()사용할 $.parseJSON()수 있습니까?

작업 예 http://jsfiddle.net/pKXMa/


이것은 나를 위해 작동합니다. 나는 $ .parseJSON ()를 호출 한 후 작업 JSON 개체를 얻을
Olafur Tryggvason

Web Api 인증과 같은 일부 시스템은 "stringify"를 거쳐야하는 Object {propertyOneWithoutQuotes : "<value1>", ... propertyNWithoutQuotes : "<valueN>"} 형식으로 개체를 반환합니다. 여러 소스가있는 경우 데이터를 표준화하기 위해 stringify를 사용하는 것이 좋습니다.
Jelgab

이것은 매우 좋은 대답입니다. JSON.stringify ()를 사용하여 객체를 직렬화하고 sessionStorage에 저장하는 것이 좋습니다. 그런 다음 $ .parseJSON ()을 사용하여 문자열을 직렬화 해제하여 객체를 가져옵니다.
Thomas. 벤츠

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
자바 스크립트의 모범 사례 중 하나는 소유하지 않은 객체를 프로토 타입하지 않는 것이라고 생각했습니다. Storage.prototype.setObj를 사용하는 것은 나쁜 생각처럼 보입니다.
britztopher

3
브라우저를 지원하는지 먼저 확인하지 않고이 프로토 타입 코드를 추가하지 말고 독점적으로 사용하십시오. 스토리지 :if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
JoeBrockhaus

4

세션 저장소는 임의의 개체를 지원할 수 없습니다. 페이지를 다시로드 한 후에는 재구성 할 수없는 함수 리터럴 (읽기 클로저)이 포함될 수 있습니다.


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

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.