javascript解析ajax返回的xml和json格式數(shù)據(jù)實(shí)例詳解
本文實(shí)例講述了javascript解析ajax返回的xml和json格式數(shù)據(jù)。分享給大家供大家參考,具體如下:
寫個(gè)例子,以備后用
一、JavaScript 解析返回的xml格式的數(shù)據(jù):
1、javascript版本的ajax發(fā)送請(qǐng)求
(1)、創(chuàng)建XMLHttpRequest對(duì)象,這個(gè)對(duì)象就是ajax請(qǐng)求的核心,是ajax請(qǐng)求和響應(yīng)的信息載體,單是不同瀏覽器創(chuàng)建方式不同
(2)、請(qǐng)求路徑
(3)、使用open方法綁定發(fā)送請(qǐng)求
(4)、使用send() 方法發(fā)送請(qǐng)求
(5)、獲取服務(wù)器返回的字符串 xmlhttpRequest.responseText;
(6)、獲取服務(wù)端返回的值,以xml對(duì)象的形式存儲(chǔ) xmlhttpRequest.responseXML;
(7)、使用W3C DOM節(jié)點(diǎn)樹(shù)方法和屬性對(duì)該XML文檔對(duì)象進(jìn)行檢查和解析。
2、 實(shí)例:
(1)、發(fā)送ajax請(qǐng)求,以及解析返回的數(shù)據(jù)
<script type="text/javascript"> /* js版本發(fā)送ajax請(qǐng)求 */ function tellxml(){ // 創(chuàng)建對(duì)象,適合于firefox 和safari var xmlhttpRequest= new XMLHttpRequest(); // 創(chuàng)建對(duì)象,適合于ie // var xmlhttpRequest=new ActiveXObject("Msxml2.XMLHTTP"); // 請(qǐng)求發(fā)送路徑 url var url="http://localhost:18080/servlet/Servlet1?aa=10"; // Open方法綁定一個(gè)發(fā)送過(guò)程,但不發(fā)送數(shù)據(jù)。Open方法最后一個(gè)參數(shù)為true時(shí)表示異步,否則同步 xmlhttpRequest.open("POST",url,true); // Send方法就是發(fā)送請(qǐng)求數(shù)據(jù) xmlhttpRequest.send(url); // readstate 就是一個(gè)xmlhttprequest 對(duì)象的一個(gè)屬性,來(lái)記錄服務(wù)器返回的狀態(tài) var readstate =xmlhttpRequest.readyState; alert("狀態(tài):"+readstate); // status 就是發(fā)送請(qǐng)求的狀態(tài),如果是200 則說(shuō)明請(qǐng)求響應(yīng)成功 var status=xmlhttpRequest.status; alert("請(qǐng)求發(fā)送結(jié)果"+status); // "responseText”是xmlhttpRequest的一個(gè)屬性,來(lái)以字符串形式存儲(chǔ)HTTP響應(yīng)值;“responseXML”屬性是以XML形式來(lái)記錄HTTP響應(yīng)的值。 var text= xmlhttpRequest.responseText; alert(text); // “responseXML”是xmlhttpRequest的一個(gè)屬性,是以XML文檔的對(duì)象來(lái)存儲(chǔ)服務(wù)器端返回的值,可以使用W3C DOM節(jié)點(diǎn)樹(shù)方法和屬性對(duì)該XML文檔對(duì)象進(jìn)行檢查和解析。 var xml= xmlhttpRequest.responseXML; var values=xml.getElementsByTagName("info"); alert("值"+values); alert("長(zhǎng)度"+values.length); // 解析獲取內(nèi)容 for(var i=0;i<values.length;i++){ var name1=values[i].getElementsByTagName("name")[0].firstChild.data; alert(name1); } }; </script>
(2)、servlet 接受ajax 請(qǐng)求:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String aaa= request.getParameter("aa"); System.out.print("ajax 數(shù)據(jù):"+aaa); // 向客戶端響應(yīng)信息 response.setCharacterEncoding("GBK"); response.setContentType("text/xml"); PrintWriter out= response.getWriter(); out.print("<?xml version=\"1.0\" encoding=\"GBK\"?>"); out.println("<infos>"); out.println("<info>"); out.println("<name>"+"name1"+"</name>"); out.println("<age>"+12+"</age>"); out.println("<name>"+"name2"+"</name>"); out.println("<age>"+22+"</age>"); out.println("</info>"); out.println("<info>"); out.println("<name>"+"name11"+"</name>"); out.println("<age>"+112+"</age>"); out.println("<name>"+"name22"+"</name>"); out.println("<age>"+222+"</age>"); out.println("</info>"); out.println("</infos>"); }
二、JavaScript 解析返回的json格式的數(shù)據(jù):注意這里獲取的是responseText 而不是responseXML也就是字符串而不是xml對(duì)象,因?yàn)榉祷氐氖莏son
1、發(fā)送請(qǐng)求,并解析返回的json格式的數(shù)據(jù)(這里返回的是json 對(duì)象的格式)
<script type="text/javascript"> /* js 解析返回的格式為 json */ function telljson(){ // 創(chuàng)建 xmlhttpRequest 對(duì)象 var xmlhttpRequest= new XMLHttpRequest(); //請(qǐng)求URL var url="http://localhost:18080/servlet/Servlet3?aa=10"; // 將請(qǐng)求過(guò)程綁定到 open 方法 xmlhttpRequest.open("POST",url,true); // 發(fā)送請(qǐng)求 xmlhttpRequest.send(url); // readstate 就是一個(gè)xmlhttprequest 對(duì)象的一個(gè)屬性用來(lái)記錄服務(wù)端響應(yīng)的狀態(tài) var readstate =xmlhttpRequest.readyState; alert("請(qǐng)求準(zhǔn)備狀態(tài):"+readstate); // status 服務(wù)器執(zhí)行的狀態(tài) var status=xmlhttpRequest.status; alert("請(qǐng)求發(fā)送結(jié)果"+status); // responseText 對(duì)象為xmlhttpRequest 對(duì)象的一個(gè)屬性,用來(lái)以字符串的方式存儲(chǔ)服務(wù)器端返回的值。 var text= xmlhttpRequest.responseText; alert("json text: "+text); // 獲取json 返回值 // 那邊傳的是json對(duì)象的格式的一個(gè)字符串,在前臺(tái)首先將字符串轉(zhuǎn)化為一個(gè)json格式的js對(duì)象 var json= eval("("+text+")"); // 通過(guò)eval() 方法將json格式的字符串轉(zhuǎn)化為js對(duì)象,并進(jìn)行解析獲取內(nèi)容 alert("age:"+json.age+"age1:"+json.age1); }; </script>
2、servlet 接受請(qǐng)求,并返回?cái)?shù)據(jù)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 向ajax 返回json格式的數(shù)據(jù) String aaa= request.getParameter("aa"); System.out.print("ajax 數(shù)據(jù):"+aaa); // 向客戶端響應(yīng)信息 response.setCharacterEncoding("GBK"); response.setContentType("text/json"); PrintWriter out= response.getWriter(); // 這里組裝json對(duì)象的格式,并轉(zhuǎn)化為json格式的字符串返回。 String stu="{age:12,age1:23,age2:33}"; out.print(stu); out.flush(); out.close(); }
三、JavaScript 解析返回的json數(shù)組格式的數(shù)據(jù):
1、發(fā)送ajax請(qǐng)求
<script type="text/javascript"> /* js 解析返回的格式為 json */ function telljson(){ // 創(chuàng)建xmlhttpRequest對(duì)象 var xmlhttpRequest= new XMLHttpRequest(); //請(qǐng)求url var url="http://localhost:18080/servlet/Servlet3?aa=10"; // open 方法綁定請(qǐng)求路徑 xmlhttpRequest.open("POST",url,true); // 發(fā)送ajax請(qǐng)求 xmlhttpRequest.send(url); // readstate 就是一個(gè)xmlhttprequest 對(duì)象的一個(gè)屬性用來(lái)記錄服務(wù)器返回的狀態(tài)信息 var readstate =xmlhttpRequest.readyState; alert("請(qǐng)求準(zhǔn)備狀態(tài):"+readstate); // status 屬性用來(lái)記錄服務(wù)器返回的執(zhí)行狀態(tài)信息 var status=xmlhttpRequest.status; alert("請(qǐng)求發(fā)送結(jié)果"+status); // responseText屬性用來(lái)以字符串方式存儲(chǔ)服務(wù)器端返回的數(shù)據(jù) var text= xmlhttpRequest.responseText; alert("json text: "+text); // 那邊傳的是json數(shù)組的格式,通過(guò)js的eval() 方法將json數(shù)組格式的字符串轉(zhuǎn)化為js數(shù)組 var json= eval("("+text+")"); // 解析這個(gè)js數(shù)組,獲取數(shù)值 var age=json[0].age; var age1=json[0].age1; var age2=json[0].age2; alert("age:"+age+"age1"+age1+"age2"+age2); }; </script>
四、ajax XMLHttpRequest 對(duì)象的三個(gè)屬性以及open 和send方法:
(1)onreadystatechange 屬性
onreadystatechange 屬性存有處理服務(wù)器響應(yīng)的函數(shù)。下面的代碼定義一個(gè)空的函數(shù),可同時(shí)對(duì) onreadystatechange 屬性進(jìn)行設(shè)置:
xmlHttp.onreadystatechange=function() { // 我們需要在這里寫一些代碼 }
(2)readyState 屬性
readyState 屬性存有服務(wù)器響應(yīng)的狀態(tài)信息。每當(dāng) readyState 改變時(shí),onreadystatechange 函數(shù)就會(huì)被執(zhí)行。
這是 readyState 屬性可能的值:
狀態(tài) | 描述 |
---|---|
0 | 請(qǐng)求未初始化(在調(diào)用 open() 之前) |
1 | 請(qǐng)求已提出(調(diào)用 send() 之前) |
2 | 請(qǐng)求已發(fā)送(這里通常可以從響應(yīng)得到內(nèi)容頭部) |
3 | 請(qǐng)求處理中(響應(yīng)中通常有部分?jǐn)?shù)據(jù)可用,但是服務(wù)器還沒(méi)有完成響應(yīng)) |
4 | 請(qǐng)求已完成(可以訪問(wèn)服務(wù)器響應(yīng)并使用它) |
xmlHttp.onreadystatechange=function() { if(xmlHttp.readyState==4) { // 從服務(wù)器的response獲得數(shù)據(jù) } }
(3)responseText 屬性
可以通過(guò) responseText 屬性來(lái)取回由服務(wù)器返回的數(shù)據(jù)。
在我們的代碼中,我們將把時(shí)間文本框的值設(shè)置為等于 responseText:
xmlHttp.onreadystatechange=function() { if(xmlHttp.readyState==4) { document.myForm.time.value=xmlHttp.responseText; } }
另外:
AJAX - 向服務(wù)器發(fā)送一個(gè)請(qǐng)求
要想把請(qǐng)求發(fā)送到服務(wù)器,我們就需要使用 open() 方法和 send() 方法。
open() 方法需要三個(gè)參數(shù):
第一個(gè)參數(shù)定義發(fā)送請(qǐng)求所使用的方法(GET 還是 POST)。
與 POST 相比,GET 更簡(jiǎn)單也更快,并且在大部分情況下都能用。
然而,在以下情況中,請(qǐng)使用 POST 請(qǐng)求:
① 無(wú)法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
② 向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒(méi)有數(shù)據(jù)量限制)
③ 發(fā)送包含未知字符的用戶輸入時(shí),POST 比 GET 更穩(wěn)定也更可靠
第二個(gè)參數(shù)規(guī)定服務(wù)器端腳本的 URL(該文件可以是任何類型的文件,比如 .txt 和 .xml,或者服務(wù)器腳本文件,比如 .asp 和 .php (在傳回響應(yīng)之前,能夠在服務(wù)器上執(zhí)行任務(wù)))。
第三個(gè)參數(shù)規(guī)定應(yīng)當(dāng)對(duì)請(qǐng)求進(jìn)行異步地處理(true(異步)或 false(同步))。
send() 方法可將請(qǐng)求送往服務(wù)器。如果我們假設(shè) HTML 文件和 ASP 文件位于相同的目錄,那么代碼是這樣的:
xmlHttp.open("GET","time.asp",true); xmlHttp.send(null);
五、之前的實(shí)例都沒(méi)有使用 XMLHttpRequest 對(duì)象的onreadystatechange 這個(gè)屬性,下面看看這個(gè)屬性的實(shí)例:
1、onreadystatechange 這個(gè)屬性在前面也說(shuō)了,就是在XMLHttpRequest 這個(gè)對(duì)象的 readyState 這個(gè)值改變的時(shí)候會(huì)執(zhí)行。
2、發(fā)送ajax請(qǐng)求并解析
<script type="text/javascript"> /* js 解析返回的格式為 json */ function telljson(){ // 創(chuàng)建對(duì)象,適合于firefox 和safari var xmlhttpRequest= new XMLHttpRequest(); //請(qǐng)求發(fā)送路徑 url var url="http://localhost:18080/servlet/Servlet3?aa=10"; // Open方法綁定一個(gè)發(fā)送過(guò)程,但不發(fā)送數(shù)據(jù)。Open方法最后一個(gè)參數(shù)為true時(shí)表示異步,否則同步 xmlhttpRequest.open("POST",url,true); // Send方法就是發(fā)送請(qǐng)求數(shù)據(jù) xmlhttpRequest.send(url); //onreadystatechange 屬性存有處理服務(wù)器響應(yīng)的函數(shù) xmlhttpRequest.onreadystatechange =function(){ //readyState 屬性存有服務(wù)器響應(yīng)的狀態(tài)信息。每當(dāng) readyState 改變時(shí),onreadystatechange 函數(shù)就會(huì)被執(zhí)行。 alert("狀態(tài)改變了:"+xmlhttpRequest.readyState); // 如果是4 請(qǐng)求已完成(可以訪問(wèn)服務(wù)器響應(yīng)并使用它) if(xmlhttpRequest.readyState==4){ var readstate =xmlhttpRequest.readyState; alert("請(qǐng)求準(zhǔn)備狀態(tài):"+readstate); var status=xmlhttpRequest.status; alert("請(qǐng)求發(fā)送結(jié)果"+status); // "responseText”是xmlhttpRequest的一個(gè)屬性,來(lái)以字符串形式存儲(chǔ)HTTP響應(yīng)值;“responseXML”屬性是以XML形式來(lái)記錄HTTP響應(yīng)的值。 var text= xmlhttpRequest.responseText; alert("json text: "+text); // 獲取json 返回值 // 那邊傳的是json數(shù)組的格式,這邊解析后就是一個(gè)json數(shù)組 var json= eval("("+text+")"); var age=json[0].age; var age1=json[0].age1; var age2=json[0].age2; alert("age:"+age+"age1"+age1+"age2"+age2); } } }; </script>
3、servlet返回的數(shù)據(jù)
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // 向ajax 返回json格式的數(shù)據(jù) String aaa = request.getParameter("aa"); System.out.print("ajax 數(shù)據(jù):" + aaa); // 向客戶端響應(yīng)信息 response.setCharacterEncoding("GBK"); response.setContentType("text/json"); PrintWriter out = response.getWriter(); // 這里使用 json 數(shù)組的格式 String stu = "[{age:12,age1:23,age2:33}]"; out.print(stu); out.flush(); out.close(); }
PS:這里再為大家提供幾款關(guān)于xml與json操作的在線工具供大家參考使用:
在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson
在線格式化XML/在線壓縮XML:
http://tools.jb51.net/code/xmlformat
XML在線壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress
在線JSON代碼檢驗(yàn)、檢驗(yàn)、美化、格式化工具:
http://tools.jb51.net/code/json
JSON在線格式化工具:
http://tools.jb51.net/code/jsonformat
在線json壓縮/轉(zhuǎn)義工具:
http://tools.jb51.net/code/json_yasuo_trans
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript中ajax操作技巧總結(jié)》、《JavaScript操作XML文件技巧總結(jié)》、《JavaScript中json操作技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
微信小程序如何保證每個(gè)頁(yè)面都已經(jīng)登陸詳解
前段時(shí)間發(fā)布了一個(gè)微信小程序的簡(jiǎn)單登錄,但遇到一個(gè)問(wèn)題,怎么確保用戶每個(gè)頁(yè)面都已經(jīng)登陸了呢,這篇文章主要給大家介紹了關(guān)于微信小程序如何保證每個(gè)頁(yè)面都已經(jīng)登陸的相關(guān)資料,需要的朋友可以參考下2021-11-11JavaScript 用cloneNode方法克隆節(jié)點(diǎn)的代碼
很多時(shí)候我們需要通過(guò)HTML DOM 的方式,用JavaScript 動(dòng)態(tài)生成很多相同的節(jié)點(diǎn),包括其子節(jié)點(diǎn)2012-10-10JS桶排序的簡(jiǎn)單理解與實(shí)現(xiàn)方法示例
這篇文章主要介紹了JS桶排序的簡(jiǎn)單理解與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了js桶排序的概念、原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11JavaScript實(shí)現(xiàn)獲取圖片文件真實(shí)格式的示例代碼
每種格式的圖片,都有自己特有的優(yōu)缺點(diǎn)以及數(shù)據(jù)結(jié)構(gòu),本篇博文的目的就是基于不同格式的圖像二進(jìn)制數(shù)據(jù),獲取到圖片的真實(shí)格式,感興趣的可以了解一下2023-02-02JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能
這篇文章主要介紹了JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能,結(jié)合實(shí)例形式分析了replace結(jié)合正則實(shí)現(xiàn)ES6字符串模板功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04javascript實(shí)現(xiàn)計(jì)算指定范圍內(nèi)的質(zhì)數(shù)示例
這篇文章主要介紹了javascript實(shí)現(xiàn)計(jì)算指定范圍內(nèi)的質(zhì)數(shù),涉及javascript數(shù)值計(jì)算與判斷相關(guān)操作技巧,需要的朋友可以參考下2018-12-12