2014-12-21 4 views
3

복잡한 객체 트리를 브라우저 나 노드 j에서 작동하는 문자열로 유지하고 싶습니다. 가장 확실한 일은 JSON.stringify와 JSON.parse를 사용하는 것입니다. 그러나 문자열과 숫자 등의 값을 얻지 만, 어떤 종류의 객체가 저장되어 있지 않으므로 복원 할 수 없습니다. 또는 값이 복원되지만 함수 바인딩은 복원되지 않습니다. JavaScript에서 메서드 함수가있는 지속 객체를 수행하는 올바른 방법은 무엇입니까?자바 스크립트에서 복잡한 객체를 문자열로 유지하는 방법

+0

데이터를 비헤이비어와 분리하고 데이터를 JSON으로 저장하고 클래스가 데이터에서 초기화 할 수있는 능력을 부여하는 것이 가장 이상적입니다. – Tomalak

+0

@Tomalak이 말한 바; 그러나 또한 어떤 종류의 함수 바인딩에 대해 묻고 있습니까? – Vince

+0

@Vince - 이는 데이터에 대한 특정 종류의 조작 만 허용하는 일반적인 데이터 조작 및 변환 기능입니다. – nwaltham

답변

1

당신은 이미 JSON.stringify()JSON.parse()으로 원하는 것을 할 수 있습니다

function SomeClass(json) { 
    var base = this; 


    base.a = 'asdf'; 
    base.b = 'fdsa'; 

    base.export = function() { 
     return JSON.stringify({ 
      a: base.a, 
      b: base.b 
     }); 
    }; 
    base.imports = function (js) { 
     base.a = js['a']; 
     base.b = js['b']; 
    }; 

    if (typeof json !== 'undefined') { 
     base.imports(json); 
    } 
} 

(P없는 가장 우아한 해결책 그러나 이것은 또한에 StackOverflow)입니다.

JSON.stringify()은 전달한 객체에 대해 .toJSON() 메소드를 검사합니다. 그래서 당신의 object/class /가 그 메소드를 구현한다면, 당신이 원하는 직렬화 된 형식을 반환 할 수 있습니다. 여기에는 객체/클래스 유형 및 나중에이를 직렬화 해제하는 데 필요한 기타 정보가 포함될 수 있습니다.

JSON.parse()은 구문 분석 된 각 JSON 값에 대해 직렬화되지 않은 값을 수동으로 반환 할 수있는 reviver function parameter입니다.

예를 들어 .toJSON()에서 데이터가 포함 된 개체를 반환 할 수 있으며 개체 유형 이름으로 설정된 __objType 속성도 반환 할 수 있습니다. 그런 다음 리버버 함수에서 값이 객체인지 확인하고 __objType 속성이 있는지 확인합니다. 그렇다면 해당 속성의 값을 확인하고 적절하게 병합을 해제하십시오 (이 작업을 수행하는 객체/클래스에 .fromJSON()을 쓸 수도 있지만 .toJSON()과는 달리 .fromJSON()에는 특별한 의미가 없음).

1

함수가 일반적으로 조작/변형을위한 정적 메서드 인 경우 JSON 데이터에서 클래스를 다시 초기화하면됩니다.

아마도 exportToJson 함수와 importFromJson 함수를 만들어야합니다.