JavaScript JSON
JavaScript?JSON
向服務(wù)器發(fā)出Ajax請求時(shí),可以以兩種不同的方式從服務(wù)器響應(yīng)檢索數(shù)據(jù):一種是使用XMLHttpRequest對象的reponseXML屬性訪問XML格式的數(shù)據(jù);一種是XMLHttpRequest對象的responseText屬性訪問字符串格式的數(shù)據(jù)。當(dāng)前,XML是進(jìn)行數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn)語言,但是使用XML的缺點(diǎn)之一是很難對它進(jìn)行解析并提取要添加到頁面的數(shù)據(jù)。
????? JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,我們稱之為JavaScript對象表示法。使用JSON進(jìn)行數(shù)據(jù)傳輸?shù)膬?yōu)勢之一是JSON實(shí)際上就是JavaScript。它基于ECMAScript第3版中JavaScript對象字面量語法子集的一種文本格式。這表示可以使用responseText從服務(wù)器中檢索JSON數(shù)據(jù),然后再使用JavaScript的eval()方法將JSON字符串轉(zhuǎn)換成JavaScript對象,那么,使用附加JavaScript就可以很地從該對象中提取數(shù)據(jù),而不需要處理DOM。
????? 另外,也有針對大部分編程語言(包括C++,C#,ColdFusion、Java、Perl、PHP和Python)的JSON庫,這些庫能將上述語言格式化數(shù)據(jù)轉(zhuǎn)換成JSON格式。
????? 盡管有許多宣傳關(guān)于XML如何擁有跨平臺,跨語言的優(yōu)勢,然而,除非應(yīng)用于Web Services,否則,在普通的Web應(yīng)用中,開發(fā)都經(jīng)常為XML的解析作秀了腦筋,無論是服務(wù)器端生成或處理XML,還是客戶端用JavaScript解析XML,都常常導(dǎo)致復(fù)雜的代碼,極低的開發(fā)效率。實(shí)際上,對于大多數(shù)Web應(yīng)用來說,根本不需要要復(fù)雜的XML來傳輸數(shù)據(jù),XML的擴(kuò)展性很少具有優(yōu)勢,許多Ajax應(yīng)用甚至直接返回HTML片段來構(gòu)建動態(tài)Web頁面。和返回XML并解析它相比,返回HTML片段大大降低了系統(tǒng)的復(fù)雜性,但同時(shí)缺少了一定的靈活性。XML使用元素、屬性、實(shí)體和其他結(jié)構(gòu)。JSON不是文檔格式,因此它不需要這些附加結(jié)構(gòu)。因?yàn)镴SON數(shù)據(jù)只包括“名-值”對(對象)或值(數(shù)組),所以JSON數(shù)據(jù)比同等的XML數(shù)據(jù)占用更少的空間,執(zhí)行速度更快。
??????(一)JSON語法?
????? JSON建構(gòu)于兩種結(jié)構(gòu):
????? 對象——名稱/值對的集合。不同的語言中,它被理解為對象,紀(jì)錄,結(jié)構(gòu),字典,哈希表,有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組。一個(gè)對象以“{”(左括號)開始,“}”(右括號)結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
????? 數(shù)組——值的有序列表。在大部分語言中,它被理解為數(shù)組。一個(gè)數(shù)組以“[”(左中括號)開始,“]”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。
????? JSON沒有變量或其他控制結(jié)構(gòu)。JSON只用于數(shù)據(jù)傳輸。
????? JSON語法是基于對面字面量和數(shù)組字面量的JavaScript語法。當(dāng)使用字面量時(shí),將包括數(shù)據(jù)本身,但不包括生成數(shù)據(jù)的表達(dá)式。
??????1、 數(shù)據(jù)類型
????? JSON數(shù)據(jù)結(jié)構(gòu)包含以下數(shù)據(jù)類型:字符、數(shù)字、布爾值(true/false)、null、對象,數(shù)組。
????? JSON字符串必須使用雙引號括起來。它們使用標(biāo)準(zhǔn)的JavaScript轉(zhuǎn)義序列。因此在以下列字符的前面要添加一個(gè)反斜線:
????? JSON具有以下這些形式:”(引號)、b(空格)、n(新行)、f(換頁)、r(回車)、t(水平定位)、u(為Unicode字符增加4個(gè)數(shù)位)、(反斜線符號)、/(正斜杠符號)。
??????2、對象字面量
????? JSON使用字面量來表示對象,如果有一個(gè)以上的成員對象,則在JSON中,可以將其表示為一個(gè)包含擁有兩個(gè)對象的數(shù)組的對象。下列代碼顯示JOSN文本形式的member對象:
???
{“memeber”:[ { “name”:”Tom”, “age”:22, “country”:”USA” }, { “name”:”WangMing”, “age”:25, “country”:”China” } ] }
??????3、使用JSON解析器
????? 可以使用JSON解析器從對象和數(shù)組中創(chuàng)建JSON文本或者JSON文本中創(chuàng)建對象和數(shù)組。JSON站占www.json.rog/json.js上提供有JSON解析器,通過將下列代碼加入到頁面的頭部上即可使用。JSON解析器提供了兩個(gè)函數(shù):toJSONString()和parseJSON()。
????? toJSONString()方法被添加到JavaScript Object和Array定義中,該方法能將JavaScript對象或數(shù)組轉(zhuǎn)換成JSON文本。不必將對象或數(shù)組轉(zhuǎn)換成字面量就能使用該方法。
????? parseJSON()方法能從JSON文本中創(chuàng)建對象或數(shù)組。
??????(二)使用XMLHttpRequest對象創(chuàng)建JSON數(shù)據(jù)請求
??????1、創(chuàng)建請求
????? 如果直接請求服務(wù)器上一個(gè)JSON文件中的JSON數(shù)據(jù),則可以利用文件名來請求JSON文件。
????? respone.open(“GET”,”classes.txt”,true);
????? 在這種情況下,classes.txt是JSON數(shù)據(jù)文件的名稱,request是創(chuàng)建用來存放XMLHttpRequest對象的變量。
??????2、 解析響應(yīng)
????? 一旦接受服務(wù)器的JSON數(shù)據(jù),就可以采用兩種不同的方式解析該響應(yīng)??梢允褂肑avaScript的內(nèi)置函數(shù)eval(),或者為了進(jìn)一步的安全,使用JSON解析器代替。
????? eval()方法可以把JavaScript字符串當(dāng)作參數(shù),還可以將該字符串轉(zhuǎn)換成對象,或作為命令動作。如果使用XMLHttpRequest對象的responseText屬性請求JSON數(shù)據(jù),那么使用eval()將JSON文本字符串轉(zhuǎn)換成JavaScript對象。因?yàn)镴SON字符串常包包含花括號,所以用圓括號來括住JSON字符串,以表明字它是一個(gè)求值表達(dá)式,而不是一個(gè)要運(yùn)行的命令。
????? var jsonResp=request.responseText;
????? jsonResp=eval(“(”+jsonResp+”)”);
????? 如果Web服務(wù)器既提供JSON數(shù)據(jù)也提供請求頁面,則適合選用eval()方法。如果涉及安全,則適合使用JSON解析器。JSON解析器只作用于JSON文本,并且不執(zhí)行其他JavaScript。在這種情況下,可以使用responseText,但要使用parseJSON()方法將JSON文本字符串轉(zhuǎn)換成JavaScript對象。要訪問parseJOSN函數(shù),需要要添加引用json.js文件到頁面中。
????? var jsonResp=request.responseText;
????? jsonResp=jsonResp.parseJSON();
????? 下面以實(shí)例來說明在JavaScript中簡單使用JSON:
????
<script type="text/javascript"> var user =[ { "name":”shenmiweiyi”, "QQ":306451129, "email":”shenmiweiyi@163.com” "address": [ {"City":"ZhengZhou","ZipCode":"450000"}, {"City":"BeiJing","ZipCode":"100000"} ] }, { "name":”kehao”, "QQ":254892313, "email":”kehao@163.com” "address": [ {"City":"ShangHai","ZipCode":"200000"}, {"City":"GuangZhou","ZipCode":"510000"} ] } ] alert(user[0].name+”的Email是:”user[0].email); //outputs shenmiweiyi的Email是:shenmiweiyi@163.com alert(user[1].name+”住在:”user[1].address[0].city) //outputs kehao住在:ShangHai </script>
????? JSON已經(jīng)是JavaScript標(biāo)準(zhǔn)的一部分。目前,主流的瀏覽器對JSON支持都非常完美,應(yīng)用JSON,我們可以從XML的解析中擺脫出來,對那些應(yīng)用Ajax的Web2.0網(wǎng)站來說,JSON確實(shí)是目前最靈活的輕量級方案。
JSON 格式化后為 JavaScript 對象
JSON 格式在語法上與創(chuàng)建 JavaScript 對象代碼是相同的。
由于它們很相似,所以 JavaScript 程序可以很容易的將 JSON 數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對象。
JSON 語法規(guī)則
數(shù)據(jù)為 鍵/值 對。
數(shù)據(jù)由逗號分隔。
大括號保存對象
方括號保存數(shù)組
JSON 數(shù)據(jù) - 一個(gè)名稱對應(yīng)一個(gè)值
JSON 數(shù)據(jù)格式為 鍵/值 對,就像 JavaScript 對象屬性。
鍵/值對包括字段名稱(在雙引號中),后面一個(gè)冒號,然后是值:
"firstName":"John"
JSON 對象
JSON 對象保存在大括號內(nèi)。
就像在 JavaScript 中, 對象可以保存多個(gè) 鍵/值 對:
{"firstName":"John", "lastName":"Doe"}
JSON 數(shù)組
JSON 數(shù)組保存在中括號內(nèi)。
就像在 JavaScript 中, 數(shù)組可以包含對象:
"employees":[
??? {"firstName":"John", "lastName":"Doe"},?
??? {"firstName":"Anna", "lastName":"Smith"},?
??? {"firstName":"Peter", "lastName":"Jones"}
]
在以上實(shí)例中,對象 "employees" 是一個(gè)數(shù)組。包含了三個(gè)對象。
每個(gè)為個(gè)對象為員工的記錄(姓和名)。
JSON 字符串轉(zhuǎn)換為 JavaScript 對象
通常我們從服務(wù)器中讀取 JSON 數(shù)據(jù),并在網(wǎng)頁中顯示數(shù)據(jù)。
簡單起見,我們網(wǎng)頁中直接設(shè)置 JSON 字符串 (你還可以閱讀我們的?JSON 教程):
首先,創(chuàng)建 JavaScript 字符串,字符串為 JSON 格式的數(shù)據(jù):
var text = '{ "employees" : [' +
'{ "firstName":"John" , "lastName":"Doe" },' +
'{ "firstName":"Anna" , "lastName":"Smith" },' +
'{ "firstName":"Peter" , "lastName":"Jones" } ]}';
然后,使用 JavaScript 內(nèi)置函數(shù) JSON.parse() 將字符串轉(zhuǎn)換為 JavaScript 對象:
var obj = JSON.parse(text);