JavaScript中的JSON

來源:互聯網
上載者:User

JavaScript這種程式設計語言首要的目的是為Netscape Navigator提供一種頁面指令碼語言。它仍被普遍的認為是Java的一個子集,但事實並非如此。它是一種文法類似c語言並且支援物件導向的Scheme-like語言。JavaScript使用了ECMAScript語言規範第三版進行了標準化。

JSON是JavaScript物件導向文法的一個子集。由於JSON是JavaScript的一個子集,因此它可清晰的運用於此語言中。

var myJSONObject = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};

上面的樣本,建立了一個包括單獨成員”bindings”的對象,此成員包括一個含有三個對象(”ircEvent”, “method”, 與 “regex”)的數組

成員可以通過.或者下標操作符檢索。

myJSONObject.bindings[0].method    // "newURI"

為了將JSON文本轉換為對象,可以使用eval()函數。eval()函數調用JavaScript編輯器。由於JSON是JavaScript的子集,因此編譯器將正確的解析文本併產生對象結構。文本必須括在括弧中避免產生JavaScript的文法歧義。

var myObject = eval('(' + myJSONtext + ')');

eval函數非常快速。它可以編譯執行任何JavaScript程式,因此產生了安全性問題。當使用可信任與完善的原始碼時才可以使用eval函 數。這樣可以更安全的使用JSON解析器。使用XMLHttpRequest的web應用,頁面之間的通訊只允許同源,因此是可以信任的。但這卻不是完善 的。如果伺服器沒有嚴謹的JSON編碼,或者沒有嚴格的輸入驗證,那麼可能傳送包括危險指令碼的無效JSON文本。eval函數將執行惡意的指令碼。

使用JSON解析器可以防止此類事件。JSON解析器只能辨識JSON文本,拒絕所有指令碼。提供了本地JSON支援的瀏覽器的JSON解析器將遠快於eval函數。預計未來的ECMAScript標準將支援本地JSON。

var myObject = JSON.parse(myJSONtext, reviver);

一個替換函數(reviver function)做為選擇性參數被最終結果的每一級的鍵(key)與值(value)調用。 每個值都將被替換函數的值代替。這可以用來將一般的類改變成偽類的執行個體,或者將日期文字轉變為日期對象。

myData = JSON.parse(text, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
return value;
});

JSON stringifier進行反向操作,可以把JavaScript資料結構轉換為JSON文本。JSON不支援迴圈資料結構,因此應小心不要為JSON stringifier提供迴圈結構。

var myJSONText = JSON.stringify(myObject, replacer);

如果stringify函數發現一個帶有toJSON方法的對象,它將執行此方法,並且返回產生的值。這樣一個對象就可以決定自己的JSON表現。

stringifier方法可以攜帶一個可選的字串數組。這些字串被用於選擇包括在JSON文本中的屬性。

stringifier方法可以攜帶一個可選的替代(replacer)函數。它將在結構中每個值的toJSON方法(如果有的話)後面執行。它將每個鍵與值做為參數傳遞,當然對象要包含這個鍵。傳回值將被字串化。

如果沒有提供數組或替代函數,一個用於忽略被整合的屬性的可選替代函數將被提供。如果想要所有被繼承的屬性,可以提供一個簡單的替換函數:

var myJSONText = JSON.stringify(myObject, function (key, value) {
return value;
});

對於在JSON中沒有表達的值(如函數與undefined)是排除在外的。

不能確定的數量將被替換為null。為了替代其它的值,可以像下面一樣使用替換(replacer)函數

function replacer(key, value) {
if (typeof value === 'number' && !isFinite(value)) {
return String(value);
}
return value;
}

開放原始碼的JSON解析器與JSON stringifier可以使用。通過minified可以小於2.5K。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.