JavaScript中的JSON

JavaScript 是一種通用的編程語言, 從一開始就被作爲Netscape Navigator瀏覽器的頁面腳本執行語言. 它仍然被廣泛的認爲是Java的一個子集, 儘管事實並不是這樣. 它是一種類 Scheme 的語言, 同時有着類 C 的語法和 弱對象. JavaScript在ECMAScript的 ECMAScript Language Specification, Third Edition 中被標準化.

JSON 是JavaScript對象文字符號的一個子集. 由於JSON是JavaScript的一個子集, 它可以自如的在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 更快. 原生的JSON支持很有可能包含在ECMAScript下一個版本的標準中.

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

可選的reviver參數是一個函數, 在每個鍵/值在每一級的最終結果後都會被調用. 每個值將會被替換爲reviver函數的返回結果. 它可以用來將對象組織成僞類(pseudoclasses)的一個實例, 或者將date字符串轉換成Date對象

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字符串化是一個反過來的動作, 它將JavaScript的數據結構轉化成JSON字符串. JSON不支持循環的數據結構, 因此在用JSON字符串化的時候, 不要給它循環引用的結構.

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

如果 stringify 方法發現對象包含了一個 toJSON 的方法, 它會調用這個方法, 然後將返回的結果字符串化. 這允許對象自己定義它們的JSON表示方式.

字符串化方法可以帶一個可選的字符串數組. 這些字符串可以用來選擇哪些屬性將會被包含在生成的JSON文本中.

字符串化方法還可以使用一個可選的 replacer 函數, 這個函數將會在結構中的每個值的 toJSON 方法(如果存在的話) 後調用. 它將接收每個key和value作爲它的參數. 這會被綁定在包含key的對象中. 它返回的值會被字符串化.

沒有JSON表示的值(比如函數和undefined)將會被排除.

無限大的數字將會被替換爲NULL, 要替換其他值, 你可以用類似的 replacer 函數:

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

提供一個合適的 reviver 函數給 JSON.parse 就可以實現.

這裏有開放源代碼的JSON 解析器. 在執行 最小化 後, 還不到2.5K.

本文轉載自:JavaScript中的JSON

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章