




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、服務(wù)器端的 JSON在 本系列最近發(fā)表的一篇文章中 ,您已經(jīng)了解了如何將 JavaScript 對象轉(zhuǎn)變成 JSON 格式。這種格式 很容易用于發(fā)送(和接收與對象甚至對象數(shù)組對應(yīng)的數(shù)據(jù)。在 本系列 的最后一篇文章中,您將會學(xué)習(xí) 如何處理以 JSON 格式發(fā)送到服務(wù)器的數(shù)據(jù)以及如何使用相同格式對腳本進(jìn)行回復(fù)。JSON 的真正價值正如在 本系列上一篇文章 中所描述的那樣, JSON 是適用于 Ajax 應(yīng)用程序的一種有效格式, 原因是它 使 JavaScript 對象和字符串值之間得以快速轉(zhuǎn)換。 由于 Ajax 應(yīng)用程序非常適合將純文本發(fā)送給服務(wù)器 端程序并對應(yīng)地接收純文本, 相比不能生成文本的
2、API, 能生成文本的 API 自然更可取; 而且, JSON 讓 您能夠處理本地 JavaScript 對象,而無需為如何表示這些對象多費心思。 developerWorks Ajax 資源中心 請訪問 Ajax 資源中心 , 這 是有關(guān) Ajax 編程模型信 息的一站式中心,包括很多 文檔、教程、論壇、 blog 、 wiki 和新聞。任何關(guān)于 Ajax 的新信息都能在這里 找到。XML 也可以提供文本方面的類似益處,但用于將 JavaScript 對象轉(zhuǎn)換成 XML 的幾個現(xiàn)有 API 沒有 JSON API 成熟;有時,您必須在創(chuàng)建和處理 JavaScript 對象時格外謹(jǐn)慎以確保所進(jìn)
3、行的處理能與所選用的 XML 會話 API 協(xié)作。 但對于 JSON, 情況就大不相同:它能處理幾乎所有可能的對象類型,并會返回給您一個非常好的 JSON 數(shù)據(jù)表示。因此, JSON 的最大價值在于可以將 JavaScript 真的 作為 JavaScript而非數(shù)據(jù)格式語言進(jìn)行處理。 您所學(xué)到的所有有關(guān)使用 JavaScript 對象的技巧都可以應(yīng)用到代碼中,而無需為如何將這些對象轉(zhuǎn)變成文本而多費心思。這之后,可以進(jìn)行如下所示的簡單 JSON 方法調(diào)用:String myObjectInJSON =myObject.toJSONString(;現(xiàn)在就可以將結(jié)果文本發(fā)送給服務(wù)器了。回頁首將 J
4、SON 發(fā)給服務(wù)器將 JSON 發(fā)給服務(wù)器并不難, 但卻至關(guān)重要, 而且還有一些重要的選擇要做。 但是, 一旦決定使用 JSON, 所要做的這些選擇就會十分簡單而且數(shù)量有限,所以您需要考慮和關(guān)注的事情不多。重要的是能夠?qū)?JSON 字符串發(fā)送給服務(wù)器,而且最好能做到盡快和盡可能簡單。通過 GET 以名稱 /值對發(fā)送 JSON將 JSON 數(shù)據(jù)發(fā)給服務(wù)器的最簡單方法是將其轉(zhuǎn)換成文本,然后以名稱 /值對的值的方式進(jìn)行發(fā)送。請務(wù) 必注意, JSON 格式的數(shù)據(jù)是相當(dāng)長的一個對象,看起來可能會如清單 1 所示:清單 1. JSON 格式的簡單 JavaScript 對象var people = &qu
5、ot;programmers": "firstName": "Brett", "lastName":"McLaughlin", "email": "brettnewI" , "firstName": "Jason", "lastName":"Hunter", "email": "jason" , "firstName": &qu
6、ot;Elliotte", "lastName":"Harold", "email": "elharo" , "authors": "firstName": "Isaac","lastName": "Asimov", "genre": "science fiction" , "firstName": "Tad", "l
7、astName": "Williams", "genre": "fantasy" , "firstName": "Frank","lastName": "Peretti", "genre": "christian fiction" , "musicians": "firstName": "Eric", "lastName": &
8、quot;Clapton", "instrument": "guitar" , "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" 如果要以名稱 /值對將其發(fā)送到服務(wù)器端,應(yīng)該如下所示:var url = "organizePeople.php?people=" + people.toJSONString(;xml
9、Http.open("GET", url, true;xmlHttp.onreadystatechange = updatePage;xmlHttp.send(null;這看起來不錯,但卻存在一個問題:在 JSON 數(shù)據(jù)中會有空格和各種字符, Web 瀏覽器往往要嘗試對其 繼續(xù)編譯。要確保這些字符不會在服務(wù)器上(或者在將數(shù)據(jù)發(fā)送給服務(wù)器的過程中引起混亂,需要在 JavaScript escape(函數(shù)中做如下添加:var url = "organizePeople.php?people=" + escape(people.toJSONString( ;
10、request.open("GET", url, true;request.onreadystatechange = updatePage;request.send(null;該函數(shù)可以處理空格、斜線和其他任何可能影響瀏覽器的內(nèi)容,并將它們轉(zhuǎn)換成 Web 可用字符(比如, 空格會被轉(zhuǎn)換成 %20,瀏覽器并不會將其視為空格處理,而是不做更改,將其直接傳遞到服務(wù)器。之后, 服務(wù)器會(通常自動再把它們轉(zhuǎn)換回它們傳輸后的本來 “ 面目 ” 。這種做法的缺點有兩個:在使用 GET 請求發(fā)送大塊數(shù)據(jù)時,對 URL 字符串有長度限制。雖然這個限制很寬泛,但對象 的 JSON 字符串表示的
11、長度可能超出您的想象,尤其是在使用極其復(fù)雜的對象時更是如此。 在跨網(wǎng)絡(luò)以純文本發(fā)送所有數(shù)據(jù)的時候,發(fā)送數(shù)據(jù)面臨的不安全性超出了您的處理能力。簡言之,以上是 GET 請求的兩個限制,而不是簡單的兩個與 JSON 數(shù)據(jù)相關(guān)的事情。在想要發(fā)送用戶 名和姓之外的更多內(nèi)容,比如表單中的選擇時,二者可能會需要多加注意。若要處理任何機密或極長的內(nèi) 容,可以使用 POST 請求。利用 POST 請求發(fā)送 JSON 數(shù)據(jù)當(dāng)決定使用 POST 請求將 JSON 數(shù)據(jù)發(fā)送給服務(wù)器時,并不需要對代碼進(jìn)行大量更改,如下所示:var url = "organizePeople.php?timeStamp=&qu
12、ot; + new Date(.getTime(;request.open("POST", url, true;request.onreadystatechange = updatePage;request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded" request.send(people.toJSONString(;這些代碼中的大部分,您都在 “ 掌握 Ajax,第 3 部分 :Ajax 中的高級請求和響應(yīng) ” 中見過,應(yīng)該比較 熟悉,第
13、3 部分重點介紹了如何發(fā)送 POST 請求。請求使用 POST 而非 GET 打開,而且Content-Type 頭被設(shè)置為讓服務(wù)器預(yù)知它能得到何種數(shù)據(jù)。在這種情況下,即為application/x-www-form-urlencoded,它讓服務(wù)器知道現(xiàn)在發(fā)送的是文本,正如它從常規(guī)的 HTML 表 單中得到的一樣。另一個簡單提示是 URL 的末尾追加了時間。這就確保了請求不會在它第一次被發(fā)送后即緩存,而是會在 此方法每次被調(diào)用后重新創(chuàng)建和重發(fā);此 URL 會由于時間戳的不同而稍微有些不同。這種技巧常被用于 確保到腳本的 POST 每次都會實際生成新請求且 Web 服務(wù)器不會嘗試緩存來自服務(wù)器
14、的響應(yīng)。JSON 就只是文本不管使用 GET 還是 POST,關(guān)鍵之處在于 JSON 就只是文本。由于不需要特殊編碼而且每個服務(wù)器端 腳本都能處理文本數(shù)據(jù),所以可以輕松利用 JSON 并將其應(yīng)用到服務(wù)器。假如 JSON 是二進(jìn)制格式的或 是一些怪異的文本編碼,情況就不這么簡單了;幸好 JSON 只是常規(guī)的文本數(shù)據(jù)(正如腳本能從表單提 交中所接收到的數(shù)據(jù), 在 POST 段和 Content-Type 頭中亦可以看出 , 所以在將數(shù)據(jù)發(fā)送到服務(wù)器時 無需太費心?;仨撌自诜?wù)器上解釋 JSON一旦您編寫完客戶端 JavaScript 代碼、 允許用戶與 Web 表單和 Web 頁的交互、 收集發(fā)送
15、給服務(wù)器端 程序以做處理所需的信息,此時,服務(wù)器就成為了應(yīng)用程序(如果調(diào)用了異步使用的服務(wù)器端程序,則可 能是我們認(rèn)為的所謂的 “Ajax 應(yīng)用程序 ” 中的主角。在此時,您在客戶端所做的選擇(比如使用 JavaScript 對象, 然后將其轉(zhuǎn)換成 JSON 字符串 必須要與服務(wù)器端的選擇相匹配, 比如使用哪個 API 解碼 JSON 數(shù)據(jù)。處理 JSON 的兩步驟不管在服務(wù)器端使用何種語言,在服務(wù)器端處理 JSON 基本上就需要兩個步驟。1. 針對編寫服務(wù)器端程序所用的語言,找到相應(yīng)的 JSON 解析器 /工具箱 /幫助器 API。2. 使用 JSON 解析器 /工具箱 /幫助器 API 取
16、得來自客戶機的請求數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)變成腳本能理 解的東西。以上差不多就是目前所應(yīng)了解的大致內(nèi)容了。接下來,我們對每個步驟進(jìn)行較為詳細(xì)的介紹。尋找 JSON 解析器尋找 JSON 解析器或工具箱最好的資源是 JSON 站點(有關(guān)鏈接,請參閱 參考資料 。在這里,除了 可以了解此格式本身的方方面面之外, 還可以通過各種鏈接找到 JSON 的各種工具和解析器, 從 ASP 到 Erlang ,到 Pike,再到 Ruby,應(yīng)有盡有。您只需針對自己編寫腳本所用的語言下載相應(yīng)的工具箱即可。 為了讓服務(wù)器端腳本和程序能夠使用此工具箱,可以根據(jù)情況對其進(jìn)行選擇、擴(kuò)展或安裝(如果在服務(wù)器 端使用的是 C#、 P
17、HP 或 Lisp,則可變性更大。例如,如果使用的是 PHP,可以簡單將其升級至 PHP 5.2 并用它完成操作;在 PHP 這個最新版本默認(rèn) 包含了 JSON 擴(kuò)展。實際上,那也是在使用 PHP 時處理 JSON 的最好方法。如果使用的是 Java servlet , 上的 org.json 包顯然就是個不錯的選擇。在這種情況下,可以從 JSON Web 站點 下載 json.zip 并將其中包含的源文件添加到項目構(gòu)建目錄。編譯完這些文件后,一切就就緒了。對于所 支持的其他語言,同樣可以使用相同的步驟;使用何種語言取決于您對該語言的精通程度,最好使用您所 熟悉的語言。使用
18、JSON 解析器一旦獲得了程序可用的資源,剩下的事就是找到合適的方法進(jìn)行調(diào)用。比如,假設(shè)為 PHP 使用的是 JSON-PHP 模板:/ This is just a code fragment from a larger PHP server-side scriptrequire_once('JSON.php'$json = new Services_JSON(;/ accept POST data and decode it$value = $json->decode($GLOBALS'HTTP_RAW_POST_DATA'/ Now work wit
19、h value as raw PHP通過該模板,可將獲得的所有數(shù)據(jù)(數(shù)組格式的、多行的、單值的或 JSON 數(shù)據(jù)結(jié)構(gòu)中的任何內(nèi)容轉(zhuǎn) 換成原生 PHP 格式,放在 $value變量中。如果在 servlet 中使用的是 org.json 包,則會使用如下代碼:public void doPost(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException StringBuffer jb = new StringBuffer(;String line = null;try
20、 BufferedReader reader = request.getReader(;while (line = reader.readLine( != nulljb.append(line; catch (Exception e /report an error try JSONObject jsonObject = new JSONObject(jb.toString(; catch (ParseException e / crash and burnthrow new IOException("Error parsing JSON request string"/ Work with the data using methods like./ int someIn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 艾滋病護(hù)理常規(guī)
- 種子標(biāo)簽管理辦法培訓(xùn)
- 女孩青春期性教育
- 循證護(hù)理查房過程
- 深圳來電科技初級java面試題及答案
- 定時任務(wù)批量處理java面試題及答案
- 人品挑戰(zhàn)測試題及答案
- 2025年塑鋁穩(wěn)態(tài)管項目申請報告
- 子宮肉瘤超聲診斷
- 中醫(yī)護(hù)理技術(shù)展演
- 2025-2030年中國高導(dǎo)磁芯行業(yè)深度研究分析報告
- 2025年 道路運輸企業(yè)主要負(fù)責(zé)人考試模擬試卷(100題)附答案
- 2025至2030中國執(zhí)法系統(tǒng)行業(yè)經(jīng)營效益及前景運行態(tài)勢分析報告
- 2025年全國法醫(yī)專項技術(shù)考試試題及答案
- 供應(yīng)鏈公司展會策劃方案
- 南通市崇川區(qū)招聘 社區(qū)工作者筆試真題2024
- 【藝恩】出游趨勢洞察報告
- 學(xué)生因病缺課管理制度
- 四川省成都市西川中學(xué)2025年八年級英語第二學(xué)期期末檢測模擬試題含答案
- 《Linux系統(tǒng)安全》課件
- 辦公家具產(chǎn)品設(shè)計方案
評論
0/150
提交評論