2011-08-13 8 views
6

죄송합니다, 내 첫 JS 프로젝트 ... 내가 JSON을 사용하여 JS에서 사용자 정의 개체를 직렬화하기 위해 노력하고있어JSON.parse, JS의 타입 캐스팅 및 revivers

입니다. 문제는 JSON.parse()가 객체를 원래 유형으로 반환하지 않는다는 것입니다. 반환 된 객체를 원하는 유형으로 직접 캐스팅하는 것이 가능하지 않은 것 같아서 '리바이벌'옵션을 사용합니다.

내가 여기에 뭔가를 찾을 수 있습니까? 객체를 직렬화 및 비 직렬화하는 커스텀 메소드를 작성하지 않아도되는 JSON의 핵심은 아니 었습니까? 내 객체를 '부활'시키는 자체 메서드를 작성해야한다면 JSON을 사용하는 것이 무엇입니까?

+0

'reviver' [here] [1] 사용에 대한 답을 참조하십시오. [1] : http://stackoverflow.com/questions/14027168/how-to-load-json-into-a-function-rather-than-an-object/14028886#answer-14028886 –

답변

9

JSON은 원시 데이터 형식입니다. 매우 원시적입니다. 사전 (일명 자바 스크립트 객체, 해시, 연관 배열), 배열, 문자열, 숫자, 부울 및 null을 지원합니다. 그게 전부 야. 더 많은 일을하지 않는 이유는 원시 언어가 언어에 구속력이없고 거의 모든 프로그래밍 언어가 이러한 유형의 데이터를 처리 할 수있는 도구를 내장하고 있기 때문입니다.

"class"와 같은 다른 표기법을 사용하면 갑자기 특정 언어 나 코드 케이스에 매우 달라지며 광범위하고 일반적인 적용 가능성을 잃게됩니다.

JSON을 간단한 원시 데이터로 생각하십시오. JSON 인스턴스 마샬링 또는 완전한 개체 직렬화가 아닙니다. 따라서 생성자에서 인스턴스화 된 JS 객체를 직렬화하려는 경우 "revivers"를 작성해야합니다.

new Book({ 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
}); 

당신은 단순히 선택의 생성자에 대한 호출로 데이터의 당신의 일반 목적 (당신의 JSON.parse()의 결과를) 통과 :

은 접근 things like backbone.js take입니다. 거기에서 당신은 당신의 새로운 목표에 그것의 가치를 읽는 많은 것을 할 수있다.

자바에는 루비 에서처럼 Marhsal.dump(obj)과 같이 전체 개체를 정렬하는 표준 방법이 없습니다.


편집 : 마지막으로 중요한 점 ... 다른 언어에서 생각하는 것처럼

자바 스크립트 객체는 "유형"을 필요가 없습니다. Javascript 객체는 단순히 키/값 쌍의 사전입니다. new SomeClass() 같은 작업을 수행하면 함수 개체의 prototype 속성을 가리키는 특수 prototype 속성이있는 새 개체를 얻게됩니다. 객체가 인 경우 인 경우 SomeClass의 인스턴스는 언뜻 생각하면 생각할 수있는 것보다 명확하지 않습니다.

대신 "내 생성자 함수 객체는 무엇입니까?"라고 물어볼 수 있습니다. 또는 "프로토 타입 체인에 어떤 객체가 있습니까?"

문자열로 저장되는 JSON에 "type"을 전달하려면 프로토 타입 객체에 대한 참조를 어떻게 저장합니까? 어쩌면 프로토 타입 객체는 전역 영역에 이름이 지정되지 않고 클로저를 통해서만 사용할 수 있습니까? 그런 다음 문자열에 쓰면 더 이상 프로토 타입 객체를 참조 할 방법이 없습니다.

점은 폐쇄 어휘 범위 지정 및 개체에 더 리터럴 값 이상의 C 포인터처럼 그 값을 유지한다는 사실을 기반으로 자바 스크립트 프로토 타입 접근 방식이 완전히 직렬화 객체에 매우 열심히한다, 그것과 결합 된 인스턴스를 반대하는 것입니다 VM 외부의 위치로 이동합니다.

+0

이 흥미로운 질문에 대한 명확하고 간단한 대답은 +1. –

+1

명확하고 간단하게 설명하기 전까지는 자바 스크립트 "형 식"을 설명하는 모든 편집을 bulloxed했습니다. :) –