天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

XENON基于JSON變種

但是在用JSON的過程中,我遇到了一個問題――這個問題想必是大家多少都遇到過,那就是:JSON沒有定義日期和時間的傳遞方式。
盡管在今年3月的一次更新中,json2.js已經增加了對Date函數和ISO-8601式的日期/時間格式,但各種常用的開發工具中對日期的支持還是五花八門、千奇百怪的,完全沒有統一。
而且,除了日期/時間以外,個別時候我們還需要一些類或者函數的支持,而這些都是不被JSON所支持的。

可能有的人看到這里要問了:既然JSON不支持,那為什么不去用別的數據描述/傳輸方式呢?
原因是JSON本身就是JavaScript(其參考標準為ECMAScript)的功能子集,任何稍懂JavaScript的人都可以輕松地利用JSON。

解析JSON最簡單的辦法是直接使用eval函數將其作為JavaScript代碼來執行,而JSON常常被用在互聯網上的不同應用之間傳遞,所以直接將收到的JSON內容傳入eval函數是具有很大的風險的,因此在RFC文檔中嚴格規定了JSON的格式,并且給出了檢驗其安全性的辦法。
而這個檢驗辦法就禁止了函數的運行。

總而言之,因為JSON在使用上“偶爾”會有些不方便,所以我就開始動腦筋擴展JSON了。


在參考了RFC-4627、json2.js以及一些常見的JavaScript語法著色器以后,我發現:雖然json2.js已經有了對日期/時間的支持,但它所采用的語法分析的模式,這就意味著如果不是對語法分析有一定的了解,是很難對它進行擴展的;即使我稍微研習過一些語法分析的知識,想要擴展它也并非很容易的事情,更別談日后的維護了。
所以我決定用RFC-4627中建議的較為簡單的正則表達式過濾法。

這個擴展的基本實現是這樣的:
復制代碼 代碼如下:
function Xenon(){}
var protoXenon = Xenon.prototype;
protoXenon.xeval = function(s){
var al = [], vl = [], ol = {};
function $(i, v){
// i = parseInt(i);
// return ol[i] || (ol[i] = v);
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 = function(s){
var T = this;
return (!/[^/),:{}/[/]0-9./-+Eaeflnr-u /n/r/t]/.test(
s.replace(/"(//.|[^"http://])*"/g, '')
.replace(/([^/s:/[,/(]+?)/(/g,function($0, $1){
// return T.propertyIsEnumerable($1) ? '' : $1 + '(';
return T.propertyIsEnumerable($1) ? '' : '@';
})) || null) &&
this.xeval(s);
};

基本用法就是創建一個xenon對象,為其設置新的成員以啟用擴展函數。
可以把擴展函數直接添加到xenon對象上,也可以在全局作用域中聲明函數再在xenon對象上設置非函數類型的成員值。
例子:
復制代碼 代碼如下:
var xenon = new Xenon();
xenon.Array = 0;
xenon.$ = 0;
xenon.date = function(s){return new Date(s);};
var o = xenon.safeXeval('{"list":Array(3,6,9),"created":$(1,date("Tue Jul 27 02:48:03 UTC+0800 2010")),"modified":$(1)}');
print(o.list);
print(o.created);
print(o.modified == o.created);

注:這個例子并不能直接作為JScript.NET代碼執行,若要在JScript.NET中使用則必須將字符串"unsafe"作為第二個參數傳遞給eval函數。
注2:function關鍵字前增加“0,”是為了兼容于IE所使用的JScript引擎――當前的非CLI版本JScript引擎在其eval的實現中并不能正確地理解包圍著函數定義的圓括號的意義,會因此引發語法錯誤。
在這個例子中使用了三個函數擴展:Array為全局作用域中的JavaScript內置函數;$是我在XENON中實現的內置功能,可以在多處引用同一個對象;而date則是對Date構造器的包裝。
在XENON的實現中我沒有讓它支持new操作符創建新對象,我沒發現有要用new而不能直接用擴展函數的理由。

關于名字:起初打算叫做xJson,但是后來想想覺得有點遜,改作XEON(eXtensible ECMAScript Object Notation)之后又發現好像是Intel的注冊商標,所以在中間多加了個N變成了XENON(eXtensible Native ECMAScript Object Notation)。查了下字典,是個化學元素的名字……就這么湊合用吧。
關于安全性:在設計檢驗方法的過程中我盡可能測試了我所想得到的字符組合,力求避免注入問題。但是由于缺乏實踐檢驗,我也不擅長語法分析之類的事情,所以可能并不是絕對安全。如果誰發現了其中的安全漏洞,可以通知我來改進它。
以后有時間我會做一個簡單的從ECMAScript對象向XENON轉換的函數;如果真的有很充裕的時間,也許我還會實現包含類名和構造器的轉換過程。

JavaScript技術XENON基于JSON變種,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲VA天堂VA欧美VA在线 | 金发欧美一区在线观看 | 午夜精品久久久内射近拍高清 | 日韩一区二区三区视频在线观看 | 99re久久超碰视频精品 | 国产精品18久久久久久白浆. | 美女胸网站 | 各种场合肉H校园1V1 | 久草热在线 | 99九九精品国产高清自在线 | 精品国产国偷自产在线观看 | 国产精品国产三级国AV在线观看 | 天天躁躁水汪汪人碰人 | 99精品免费观看 | 国产不卡在线观看视频 | 两个吃奶一个添下面视频 | 成人免费小视频 | yellow日本动漫免费观看 | 鬼灭之刃花街篇免费樱花动漫 | 老师小扫货水能么多叫出来 | 美女坐脸vk| 我解开了岳的乳第一个女人 | 国内精品人妻无码久久久影院蜜桃 | 亚洲欧美日韩高清专区 | 亚洲国产免费观看视频 | 男人有噶坏| 午夜片无码区在线观看 | 免费网站在线观看国产v片 免费完整版观看 | 99精品国产AV一区二区麻豆 | 久久re视频这里精品青 | 亚洲精品久久久无码AV片软件 | 性一交一无一伦一精一品 | 激情欧美日韩一区二区 | 久久亚洲这里只有精品18 | music radio在线收听 | 男同志vdieos免费 | 久久日本片精品AAAAA国产 | 老师小扫货水能么多叫出来 | 欧美成人无码A区在线观看免费 | 国产 有码 无码 电影 | 老师的蕾丝小内内湿透了 |