당신은 JSON.stringify
와 JSON.parse
에 사용자 정의 JSON 파서/stringifier를 제공 할 수 있습니다 : 사용자 정의 자극성 외에도, 당신은 또한 직렬화 될 것입니다 개체에 toJSON
방법을 정의 할 수 있습니다
var serialized = JSON.stringify(obj, /*func*/replacer);
var deserialized = JSON.parse(serialized, /*func*/reviver);
. 이 메서드는 하나의 인수를받습니다. 배열에있는 키의 이름은 이고 적용되는 경우 객체의 속성 이름은입니다. http://jsperf.com/json-reviver :
// Examples of a serializing a function
var dummyFunction = function() {return 'hey';};
Function.prototype.toJSON = function(key) {
'use strict';
return this.toString();
};
JSON.stringify(dummyFunction);
// Method 2:
var replacer = function(/*string*/key, /*any*/value, /*boolean*/pretty_print) {
if (typeof value == 'function') return value.toString();
return value;
};
JSON.stringify(dummyFunction, replacer);
// >>> "function() {\n return \"hey\";\n}"
// Result of the previous, stored in a variable
var result = '"function() {\\n return \\"hey\\";\\n}"';
// Reviver example
// Note: Just an example. Do not use it without modification in production code,
// Because the pattern can easily be misguided: "function(){}alert('Evil');x={}"
// Even if you do not mind, at least add a try-catch block inside
// `if (func)`, so that a malformed function does not break the reviver
JSON.parse(result, function(/*string*/key, /*string*/value) {
var func = /^\s*function\s*\(([^)]*)\)\s\{([\S\s]*)}$/.exec(value);
if (func) {
// Note: Function(..) is equivalent to new Function(..)
var args = func[1].match(/[^,\s]+/g); // <-- Parameters
// Function body:
if (args === null) args = [func[2]];
else args.unshift(func[2]);
return Function.apply(null, args);
}
return value;
});
는 여기에 자극성 구문 분석 대 기본 구문 분석의 JSPerf 비교입니다. 특별한 일을하지 않는 커스텀 리버브는 2 배 느리고 비싼 기능을 가진 리버 버는 훨씬 느리다는 것을 알 수 있습니다.
그러나 마지막 메서드를 기본 JSON과 "수동 변환"을 사용하는 약한 메서드와 비교하면 차이점이 무시 된 것 같습니다.
참고 : 단일 값만 벤치마킹됩니다. 모든 가능한 경우를 나타내는 하나의 벤치 마크를 작성하는 것은 불가능하기 때문에 자신의 (특정) 사례에 대한 맞춤 벤치 마크를 작성하십시오.
나는 .toJSON
의 영향을 확인하는 JSPerf test case을 만들었습니다. 노이즈를 분리하기 위해 Date
개체를 기반으로 테스트 사례를 만들었습니다. 여러 함수 호출을 사용하는 사용자 정의 함수는 기본 Date.prototype.toJSON
보다 2 배 정도 느립니다.
질문이 꽤 오래되었습니다. 만약 당신이 정말로 연재 부분에만 관심이 있다면, 제목을 바꾸고 질문의 시체를 줄이는 것을 고려해보십시오. 그러면 다른 사람들 (Google 직원)이 Q & A가 자신의 사례를 설명하는지 여부를 쉽게 판단 할 수 있습니다. –
완료, 질문을 개선하는 희망. 의견을 보내 주셔서 감사합니다! –