하지만 JSON을 사용하는 과정에서 문제가 발생했습니다. 이 문제는 모든 사람이 직면했을 것입니다. 즉, JSON은 날짜와 시간의 전송 방법을 정의하지 않습니다.
json2.js는 올해 3월 업데이트에서 날짜 기능 및 ISO-8601 날짜/시간 형식에 대한 지원을 추가했지만 일반적으로 사용되는 다양한 개발 도구의 날짜 지원은 여전히 다양하고 이상하지만 통일성이 없습니다. 조금도.
또한 날짜/시간 외에도 JSON에서 지원하지 않는 일부 클래스나 함수에 대한 지원이 필요한 경우도 있습니다.
이 내용을 보고 'JSON은 지원하지 않는데 다른 데이터 설명/전송 방법을 사용하면 어떨까?'라고 묻는 분들도 있을 것입니다.
그 이유는 JSON 자체가 JavaScript의 기능적 하위 집합(참조 표준은 ECMAScript)이고, JavaScript에 대한 지식이 조금이라도 있는 사람이라면 누구나 쉽게 JSON을 활용할 수 있기 때문입니다.
JSON을 파싱하는 가장 쉬운 방법은 eval 함수를 직접 사용하여 JavaScript 코드로 실행하는 것입니다. JSON은 인터넷의 여러 애플리케이션 간에 전달하는 데 자주 사용되므로 수신된 JSON 콘텐츠를 직접 전달합니다. 함수는 매우 위험하므로 RFC 문서에는 JSON 형식이 엄격하게 지정되어 있으며 보안 테스트 방법이 제공됩니다.
이 검사 방법은 기능 실행을 금지합니다.
요컨대 JSON은 "가끔" 사용하기 불편하기 때문에 JSON을 확장하기 위해 두뇌를 사용하기 시작했습니다.
RFC-4627, json2.js 및 일부 일반적인 JavaScript 구문 셰이더를 참조한 후 다음을 발견했습니다. json2.js는 이미 날짜/시간을 지원하지만 문법 분석 모델을 사용합니다. 문법 분석에 대한 확실한 이해가 없으면 확장하기가 어렵습니다. 문법 분석에 대한 지식이 조금 있어도 향후 유지 관리는 물론 확장도 쉽지 않습니다.
그래서 저는 RFC-4627에서 권장하는 더 간단한 정규식 필터링 방법을 사용하기로 결정했습니다.
이 확장 프로그램의 기본 구현은 다음과 같습니다.
function Xenon(){}
var protoXenon = Xenon.prototype;
protoXenon.xeval = 함수(들){
var al = [], vl = [], ol = {};
함수 $(i, v){
// i = parsInt(i)
// return ol[i] || 🎜>return ol.propertyIsEnumerable(i) ? ol[i] : (ol[i] = v)
}
for(var n in this)
if(this.propertyIsEnumerable(n) && typeof this[n] == 'function')
al.push(n), vl.push(this[n])
return eval('0,function(' al '){return 's ';}') .apply(this, vl);
protoXenon.safeXeval = 함수(s){
var T = this; {}[]0 -9.- Eaeflnr-u nrt]/.test(
s.replace(/"(\.|[^"\])*"/g, '')
.replace (/([^ s:[,(] ?)(/g,function($0, $1){
// return T.propertyIsEnumerable($1) ? '' : $1 '(';
return T .propertyIsEnumerable($1) ? '' : '@';
})) || null) &&
this.xeval(s)
}; 사용법은 xenon 객체를 생성하고 확장 기능을 활성화하기 위해 새 멤버를 설정하는 것입니다.
확장 기능을 xenon 객체에 직접 추가하거나 전역 범위에서 함수를 선언하고 비-설정을 설정할 수 있습니다. xenon 객체의 함수 유형 멤버 값 >예:
코드 복사
코드는 다음과 같습니다.
print(o.list);
print(o.created)
print(o.modified == o.created); >
참고: 이 예제는 JScript.NET 코드로 직접 실행할 수 없습니다. JScript.NET에서 사용하려면 "unsafe" 문자열을 eval 함수의 두 번째 매개 변수로 전달해야 합니다.
참고 2: function 키워드 앞에 "0"을 추가하는 것은 IE에서 사용하는 JScript 엔진과의 호환성을 위한 것입니다. 현재 비CLI 버전의 JScript 엔진은 평가 구현에서 주변 함수 정의를 올바르게 이해할 수 없습니다. 괄호로 인해 구문 오류가 발생합니다.
이 예에서는 세 가지 함수 확장이 사용됩니다. Array는 전역 범위의 JavaScript 내장 함수입니다. $는 XENON에서 구현한 내장 함수로, 여러 위치에서 동일한 개체를 참조할 수 있습니다. 쌍 Date 생성자의 래퍼입니다.
XENON 구현에서는 새로운 객체를 생성하기 위해 new 연산자를 지원하는 것을 허용하지 않았는데, 확장 기능을 직접 사용하는 대신 new를 사용해야 할 이유를 찾지 못했습니다.
이름에 대해: 원래는 xJson이라고 부르려고 했는데 좀 열악한 것 같아서 XEON(eXtensible ECMAScript Object Notation)으로 바꿨습니다. 인텔의 등록상표라 중간에 N을 하나 더 추가해서 XENON(eXtensible Native ECMAScript Object Notation)이 되었습니다. 사전을 찾아보니 화학 원소의 이름이라... 그래서 그냥 사용했습니다.
보안 정보: 검증 방법을 설계하는 과정에서 삽입 문제를 피하기 위해 최대한 많은 문자 조합을 테스트했습니다. 하지만 실무적인 테스트가 부족하고 문법 분석 같은 것을 잘 하지 못하기 때문에 절대적으로 안전하지 않을 수도 있습니다. 누구든지 보안 허점을 발견하면 알려주시면 개선할 수 있습니다.
나중에 시간이 나면 ECMAScript 객체를 XENON으로 변환하는 간단한 함수를 만들 예정이고, 시간이 충분하다면 클래스 이름과 생성자를 포함한 변환 프로세스도 구현할 수도 있습니다.