最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IE8 原生JSON支持

 更新時(shí)間:2009年04月13日 10:26:30   作者:  
你可能已經(jīng)從這篇文章的標(biāo)題中猜到了,Internet Explorer 8(目前是Beta2)提供了原生JSON的解析和序列化。
這種新的原生JSON功能能夠使Internet Explorer 8對現(xiàn)有的AJAX應(yīng)用程序運(yùn)行得更加快速和安全。

什么是JSON?

大多數(shù)開發(fā)者不是只進(jìn)行AJAX程序程序開發(fā)的,我這里先介紹一點(diǎn)背景知識。JSON是一種簡單的、人能夠閱讀的數(shù)據(jù)交換格式,在AJAX程序中,當(dāng)服務(wù)器與web程序之間傳輸數(shù)據(jù)時(shí),通常采用這種格式。

舉例來說,假如你從收藏的web郵件中選擇一個(gè)聯(lián)系人名稱,以便能夠看到該聯(lián)系人信息。服務(wù)器向web程序(運(yùn)行在瀏覽器中)發(fā)送的數(shù)據(jù)流可能是下面的樣子:

     {
          "firstName": "cyra",
           "lastName": "richardson",
           "address": {
                "streetAddress": "1 Microsoft way",
                 "city": "Redmond",
                 "state": "WA",
                 "postalCode": 98052
          },

           "phoneNumbers": [
                "425-777-7777",  
                 "206-777-7777"
           ]
     }

值得慶幸的是,這種格式與JavaScript的語法完全兼容。當(dāng)今的很多程序使用Javascript的eval()函數(shù)將這種得到的數(shù)據(jù)轉(zhuǎn)換成 Javascript對象。使用eval()是不安全的,并且耗費(fèi)資源。eval()將這個(gè)字符串解析為Jscript表達(dá)式,并且執(zhí)行。如果傳遞給 eval()的字符串被篡改過,它就可能含有我們不期望的數(shù)據(jù),甚至是別人的代碼,這樣就注入到了你的web程序中。

現(xiàn)在,有很多采用 Javascript編寫的庫,用來更加安全地解析不受信任的JSON數(shù)據(jù)。有些使用Jscript編寫的解析器(http: //www.json.org/json_parser.js)對數(shù)據(jù)進(jìn)行了嚴(yán)格的驗(yàn)證,有些庫,像json2,js(http: //www.json.org/json2.js),采用正則表達(dá)式對輸入的字符串進(jìn)行全面的檢查,然后使用eval()快速解析。理想的解決方案是一種原生實(shí)現(xiàn)方法,避免應(yīng)用程序遭受代碼注入,運(yùn)行很快,并且隨處都能使用。

IE8 Jscript中原生JSON

IE8 的Jscript引擎已經(jīng)有了JSON完全的原生實(shí)現(xiàn),在保持與ES3.1提案草案(Proposal  Working Draft,地址http://wiki.ecmascript.org/doku.php?id=es3.1: es3.1_proposal_working_draft)中所描述的JSON支持的兼容性的同時(shí),極大地提高了序列化、反序列化的速度,并且提高解析不信任數(shù)據(jù)的安全性。

API

我們定義了一個(gè)新的內(nèi)置對象“JSON”,這個(gè)對象可被修改或者重寫。看上去很像math或者其他內(nèi)置的全局對象。除了JSON對象之外,toJSON()這些特定的函數(shù)也添加到了Date、Number、String和 boolean對象的原型上。JSON對象有兩個(gè)方法:parse()和stringify()。

例如:

var jsObjString = "{\"memberNull\" : null, \"memberNum\" : 3, \"memberStr\" : \"StringJSON\", \"memberBool\" : true , \"memberObj\" : { \"mnum\" : 1, \"mbool\" : false}, \"memberX\" : {}, \"memberArray\" : [33, \"StringTst\",null,{}]";
var jsObjStringParsed = JSON.parse(jsObjString);
var jsObjStringBack = JSON.stringify(jsObjStringParsed);

這個(gè)由parse()方法產(chǎn)生、又通過stringify()方法序列化回去的對象與下面的對象是完全一樣的:

var jsObjStringParsed =
{
     "memberNull" : null,
     "memberNum" : 3,
     "memberStr" : "StringJSON",
     "memberBool" : true ,
     "memberObj" :
     {
                 "mnum" : 1,
                 "mbool" : false
    },
     "memberX" : {},
     "memberArray" :  
     [
                 33,
                 "StringTst",
                 null,
                 {}
     ]
};

JSON.parse(source, reviver)

JSON.parse方法執(zhí)行反序列化,它采用JSON格式的字符串(由參數(shù)source指定),產(chǎn)生Jscript對象或者數(shù)組。

可選參數(shù)revive是一個(gè)用戶自定義函數(shù),用來計(jì)入解析的變化。結(jié)果對象或者數(shù)組遞歸遍歷,reviver函數(shù)用在每一個(gè)成員上,每個(gè)成員值被 reviver的返回值所替代。如果reviver返回null,則對象成員被刪除。對reviver的遍歷和調(diào)用是按后序遍歷完成的。也就是說:對象的所有成員被“revived”之后,整個(gè)對象也就“revived”了。

reviver主要用來識別類似ISO這樣的字符串,將它們轉(zhuǎn)成 Date對象。到目前為止,JSON格式(http://www.json.org/)對Date對象來說,是不能來回轉(zhuǎn)換的,這是因?yàn)闆]有 Jscript的標(biāo)準(zhǔn)Date文字量。ES3.1草案(http://wiki.ecmascript.org/doku.php?id=es3.1: es3.1_proposal_working_draft)包含了一個(gè)如何使用reviver函數(shù)解決這個(gè)問題的例子。

JSON.stringify(value, replacer, space)

這個(gè)是序列化方法。它以由value參數(shù)指定的對象或者數(shù)組為參數(shù),生成JSON格式的字符串。對象或者數(shù)組遞歸訪問,序列化成特定的JSON格式。如果 value參數(shù)有toJSON()方法,那么這個(gè)方法就起第一個(gè)過濾器的作用,原始的value被value.toJSON(key)替代,最終的值被序列化。參數(shù)key是一個(gè)字符串,當(dāng)類似(key:value)這樣的對象被序列化時(shí),key是成員的名字。對根對象來說,key是空字符串。

Date.prototype.toJSON()生成一個(gè)無需轉(zhuǎn)義的字符串,是真正的序列化器,因?yàn)閟tringify()會返回最原始、沒有任何變化的字符串。Date對象通過toJSON()方法進(jìn)行序列化。

Number.prototype.toJSON ()、String.prototype.toJSON()、 Boolean.prototype.toJSON()函數(shù)返回ValueOf()。他們用來進(jìn)行對象的正確序列化,像“ var num = new Number(3.14);”這樣的對象。

可選的replacer參數(shù)起過濾器的作用,遞歸使用。它可以是個(gè)函數(shù),也可以是個(gè)數(shù)組。如果 replacer是一個(gè)函數(shù),那么對每個(gè)對象成員key:value都調(diào)用replacer(key,value)。至于根對象,調(diào)用replacer ("",value)。如果replacer是個(gè)數(shù)組,則必須是個(gè)數(shù)組字符串。數(shù)組的元素就是要進(jìn)行序列化成員的名字。序列化的順序按照數(shù)組中的名字順序。在序列化數(shù)組時(shí),數(shù)組replacer是被忽略的。

可選的參數(shù)space是關(guān)于如何格式化輸出文字的,如果該參數(shù)省略,則輸出文字沒有任何額外的空格。如果它是一個(gè)數(shù)字,它指定的是每個(gè)級別縮進(jìn)的空格數(shù)。如果它是一個(gè)字符(比如"\t"或者“ ”),它就以這些字符縮進(jìn)每一個(gè)級別的字符。

對現(xiàn)有的網(wǎng)頁有何影響?

ES3.1 JSON提案是被流行的json2.js所使用的主要因素。我們也采用JSON這個(gè)名字。全局對象JSON能夠被重寫。然而,它不再是一個(gè)未定義的對象。這與通過在腳本語言中引入new關(guān)鍵字是相同的。采用一個(gè)名字偶爾會影響現(xiàn)有的代碼。使用json2.js的頁面不太可能會受影響。除了極少數(shù)的例外,所有這些頁面都將會繼續(xù)正常工作,只能是運(yùn)行得更快。

那些自己實(shí)現(xiàn)的JSON對象定義的頁面可能會受到影響,尤其是使用類似“if(!this.JSON) { JSON=…}”這種模式定義的JSON對象。有兩種主要的方法可以解決這個(gè)問題:

1,將現(xiàn)有代碼遷移,使用原生JSON對象
如果自己的JSON實(shí)現(xiàn)是基于json2.js的某種版本的,遷移起來就很簡單。

2,決定不使用原生JSON支持,繼續(xù)使用自己現(xiàn)有的JSON對象
這可以通過重命名或者重寫JSON名字實(shí)現(xiàn)。重命名意味著要將所有使用JSON名字的代碼修改成類似“MyJSON”這樣的名字。重寫意味著確保自己的 JSON定義重寫所有使用默認(rèn)原生JSON定義的代碼。大多數(shù)情況下,只需移除條件“if(!this.JSON)”就可以了。

考慮到3.1標(biāo)準(zhǔn)的影響,使用JSON這個(gè)名字與我們通過定義好的接口進(jìn)行互操作的愿望是一致的。

關(guān)于原生JSON,要談?wù)摰氖虑檫€有很多。解析器不是基于eval() 的,是一個(gè)獨(dú)立的實(shí)現(xiàn)。它與JSON支持(http://wiki.ecmascript.org/doku.php?id=es3.1: json_support)提供的引用解析器是等同的。它也是和http://www.json.org/json_parser.js一樣安全的,并且運(yùn)行速度要快很多。所以,如果你使用eval(),或自己的JSON庫,請檢查一下IE8中原生JSON實(shí)現(xiàn),以便得到更好的性能和更安全的操作。

相關(guān)文章

  • 半個(gè)小時(shí)學(xué)json(json傳遞示例)

    半個(gè)小時(shí)學(xué)json(json傳遞示例)

    這篇文章主要介紹了半個(gè)小時(shí)學(xué)json(json傳遞示例),主要包括一維數(shù)組與二維數(shù)組,需要的朋友可以參考下
    2016-12-12
  • js解析與序列化json數(shù)據(jù)(二)序列化探討

    js解析與序列化json數(shù)據(jù)(二)序列化探討

    上一節(jié)我們講解了JSON.stringify()的基本用法,這一節(jié)我們來重點(diǎn)探討一下序列化,單獨(dú)或組合使用這兩個(gè)參數(shù)(過濾器/數(shù)組),可以更全面深入地控制JSON的序列化,感興趣的朋友可以了解下,或許對你學(xué)習(xí)json有所幫助
    2013-02-02
  • 深入分析JSON編碼格式提交表單數(shù)據(jù)

    深入分析JSON編碼格式提交表單數(shù)據(jù)

    這篇文章主要介紹了深入分析JSON編碼格式提交表單數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • 父子窗體間傳遞JSON格式的數(shù)據(jù)的代碼

    父子窗體間傳遞JSON格式的數(shù)據(jù)的代碼

    在開發(fā)的項(xiàng)目中,遇到這樣一個(gè)例子:當(dāng)用戶選擇某一個(gè)用戶名時(shí),彈出當(dāng)前用戶的評分卷,該評分卷列出了所有一級評分項(xiàng),讓用戶進(jìn)行評分操作。
    2010-12-12
  • json編寫簡單一例

    json編寫簡單一例

    主要是了解一下json的簡單寫法與應(yīng)用,方便想學(xué)習(xí)json的朋友
    2008-08-08
  • Chrome中JSON.parse的特殊實(shí)現(xiàn)

    Chrome中JSON.parse的特殊實(shí)現(xiàn)

    ECMA 262 Edition5 中提供了原生的JSON支持,其中JSON.parse用來將字符串轉(zhuǎn)成成json,見ECMA 262 Edition5 15.12.2。另見:字符串轉(zhuǎn)換成json的三種方式
    2011-01-01
  • JSON.stringify 語法實(shí)例講解

    JSON.stringify 語法實(shí)例講解

    可能有些人對系列化這個(gè)詞過敏,我的理解很簡單。就是說把原來是對象的類型轉(zhuǎn)換成字符串類型(或者更確切的說是json類型的)。就這么簡單。打個(gè)比方說,你有一個(gè)類,那么你可以通過這個(gè)方法轉(zhuǎn)換成相應(yīng)的json類型的
    2012-03-03
  • 解決json日期格式問題的3種方法

    解決json日期格式問題的3種方法

    這篇文章主要介紹了解決json日期格式問題的3種方法 ,需要的朋友可以參考下
    2014-02-02
  • js中將字符串轉(zhuǎn)換成json的三種方式

    js中將字符串轉(zhuǎn)換成json的三種方式

    使用ajax的開發(fā)項(xiàng)目過程中,經(jīng)常需要將json格式的字符串返回到前端,前端解析成js對象(JSON )。
    2011-01-01
  • ASP Json Parser修正版

    ASP Json Parser修正版

    之前因?yàn)橐胘son,在網(wǎng)上,json Generator就不少,但是,parser鮮有后來,在一個(gè)老外的啟發(fā)下,寫了一個(gè)praser,其實(shí)超簡單,就是利用了JS的eval來parse,然后,把對象再返回給vbscript代碼。
    2009-12-12

最新評論

长治县| 巴南区| 大城县| 仁寿县| 寿光市| 海兴县| 丽水市| 彭阳县| 淮南市| 朝阳区| 康马县| 新巴尔虎右旗| 阜阳市| 齐齐哈尔市| 新余市| 澎湖县| 渝北区| 龙川县| 荃湾区| 青龙| 岳阳市| 鄂伦春自治旗| 沐川县| 同仁县| 博爱县| 峡江县| 铜川市| 华亭县| 花莲县| 婺源县| 东丽区| 郯城县| 屏南县| 武山县| 皮山县| 清远市| 邵东县| 福州市| 柏乡县| 忻州市| 阜阳市|