jSON是JavaScript面向對象語法的一個子集。因爲JSON是JavaScript的一個子集,所以它可清晰的運用於此語言中。javascript
文本生成json對象,必須在外面加一對括號。java
js 代碼
web
var myJSONObject = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};
在上面的例子中,咱們建立了只包含一個成員 "bindings" 的一個對象,bindings 則包含了一個由3個對象組成的數組。這3個對象都包含3個成員:"ircEvent", "method","regex"。json
在javascript 中, 成員能夠經過「點號」來獲取。
好比:數組
js 代碼瀏覽器
myJSONObject.bindings[0].method
經過eval() 函數能夠將JSON字符串轉化爲對象。安全
js 代碼服務器
var myObject = eval('(' + myJSONtext + ')');
eval 函數很是快,可是它能夠編譯任何 javascirpt 代碼,這樣的話就可能產生安全的問題。eval 的使用是基於傳入的代碼參數是可靠的假設的,有一些狀況下,可能客戶端是不可信任的。數據結構
若是基於安全的考慮的話,最好是使用一個 JSON 解析器。 一個 JSON 解析器將只接受 JSON 文本。因此是更安全的。dom
js 代碼
var myObject = JSON.parse(myJSONtext, filter);
可選的 filter 參數將遍歷每個value key 值對, 並進行相關的處理。如:
js 代碼
myData = JSON.parse(text, function (key, value) {
return key.indexOf('date') >= 0 ? new Date(value) : value; });
stringifier 函數的做用跟 parse 相反, 用來將一個js對象轉換爲 JSON 文本。
js 代碼
var myJSONText = JSON.stringifier(myObject);
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;}