JavaScript中的JSON

作者:Douglas Crockford

原文網址:http://www.json.org/js.html

譯者:可愛的猴子

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方法(如果有的話)後面執行。它將每個鍵與值做爲參數傳遞,當然對象要包含這個鍵。值將被stringified返回。

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

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;

}

關于搜索引擎頁面分析中的 javascript 處理的2個思路
在制作搜索引擎的時候、或者做頁面分析及數據提取的時候,經常面臨頁面中存在許多JavaScript,這些Javascript 比較煩人,因爲有相當部分頁面內容寫入到了這些js腳本的命令中,而導致正常的DOM分析看不到這些文字,而...查看完整版>>關于搜索引擎頁面分析中的 javascript 處理的2個思路
 
VBScript和JavaScript中的正則基礎
比較特殊的一些正則規則應用:去除左右空格str = str.replace(/(^\s*)|(\s*$)/g,”")去除空行str = str.replace(/\n[\s| ]*\r/,”")...查看完整版>>VBScript和JavaScript中的正則基礎
 
Javascript在IE和FireFox中的不同表現
1. 對象問題 1.1 Form對象 現有問題:現有代碼這獲得form對象通過document.forms("formName"),這樣使用在IE 能接受,MF 不能。解決方法:改用 作爲下標運算。改爲document.forms["formName"]備注上述的改用 作爲下標...查看完整版>>Javascript在IE和FireFox中的不同表現
 
JavaScript中的關鍵字“VAR”使用詳解
JScript的語法教程裏面說在聲明變量時忽略var要害字是完全合法的。但是事實經常又證實想當然的結果是不可靠的。看看下面這幾個例子的結果就知道問題了: <script language="javascript">var var00 = 0;documen...查看完整版>>JavaScript中的關鍵字“VAR”使用詳解
 
JavaScript在E-mail中的應用
  javascript是一種基于對象的描述性語言,將JavaScirpt語句嵌入Html文檔,支持JavaScript的浏覽器會解釋執行JavaScript語句,實現各種效果。     一、在E-mail中使用JavaScript的可行性     一般情況下...查看完整版>>JavaScript在E-mail中的應用
 
Javascript設計網頁中的下拉菜單
  在網頁制作時,爲了更好地組織信息,使顯示的信息分類明確、層次清晰,網頁制作者往往費盡心機。常用的方法有用樹型結構顯示信息,用表格進行網頁布局,用框架(frame)組織頁面等等。但對于習慣了Windows操作系統...查看完整版>>Javascript設計網頁中的下拉菜單
 
JavaScript在E-mail中的應用
  JavaScript是一種基于對象的描述性語言,將JavaScirpt語句嵌入HTML文檔,支持JavaScript的浏覽器會解釋執行JavaScript語句,實現各種效果。  一、在E-mail中使用JavaScript的可行性?  一般情況下,電子郵件的...查看完整版>>JavaScript在E-mail中的應用
 
用javascript來顯示HTML控件的位置即javascript文件在ASP.NET中的運用
1. 首先在HTML的HEAD裏加入: <meta content="JavaScript" name="vs_defaultClientScript"><script language="javascript" src="../../Script/persistlocation.js"...查看完整版>>用javascript來顯示HTML控件的位置即javascript文件在ASP.NET中的運用
 
JavaScript實現DataGrid中的CheckBox全選與否
JavaScript實現DataGrid中的CheckBox全選與否 JavaScript實現DataGrid中的CheckBox全選與否 (一).功能 1. JavaScript檢索CheckBox並實現全選和全消功能 用C#等寫的CheckBox需要回發到服務端執行,...查看完整版>>JavaScript實現DataGrid中的CheckBox全選與否
 
 
回到王朝網路首頁