복잡한 객체 트리를 브라우저 나 노드 j에서 작동하는 문자열로 유지하고 싶습니다. 가장 확실한 일은 JSON.stringify와 JSON.parse를 사용하는 것입니다. 그러나 문자열과 숫자 등의 값을 얻지 만, 어떤 종류의 객체가 저장되어 있지 않으므로 복원 할 수 없습니다. 또는 값이 복원되지만 함수 바인딩은 복원되지 않습니다. JavaScript에서 메서드 함수가있는 지속 객체를 수행하는 올바른 방법은 무엇입니까?자바 스크립트에서 복잡한 객체를 문자열로 유지하는 방법
3
A
답변
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
함수를 만들어야합니다.
데이터를 비헤이비어와 분리하고 데이터를 JSON으로 저장하고 클래스가 데이터에서 초기화 할 수있는 능력을 부여하는 것이 가장 이상적입니다. – Tomalak
@Tomalak이 말한 바; 그러나 또한 어떤 종류의 함수 바인딩에 대해 묻고 있습니까? – Vince
@Vince - 이는 데이터에 대한 특정 종류의 조작 만 허용하는 일반적인 데이터 조작 및 변환 기능입니다. – nwaltham