您好,登錄后才能下訂單哦!
一.什么是json
json是一種取代xml的數據結構,和xml相比,它更小巧但描述能力卻很強,網絡傳輸數據使用流量更少,速度更快。
json就是一串字符串,使用下面的符號標注。
{鍵值對} : json對象
[{},{},{}] :json數組
"" :雙引號內是屬性或值
: :冒號前為鍵,后為值(這個值可以是基本數據類型的值,也可以是數組或對象),所以 {"age": 18} 可以理解為是一個包含age為18的json對象,而[{"age": 18},{"age": 20}]就表示包含兩個對象的json數組。也可以使用{"age":[18,20]}來簡化上面的json數組,這是一個擁有一個age數組的對象。
二.$.ajax()方法中dataType屬性的取值
$.ajax()方法中dataType屬性要求為String類型的參數,預期服務器返回的數據類型。如果不指定,JQuery將自動根據http包mime信息返回responseXML或responseText【在第三部分解釋】,并作為回調函數參數傳遞。可用的類型如下:
xml:返回XML文檔,可用JQuery處理。
html:返回純文本HTML信息;包含的script標簽會在插入DOM時執行。
script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),所有post請求都將轉為get請求。
json:返回JSON數據。
jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換后一個“?”為正確的函數名,以執行回調函數。
三.Mime數據類型及response的setContentType()方法
什么是MIME類型?在把輸出結果傳送到瀏覽器上的時候,瀏覽器必須啟動適當的應用程序來處理這個輸出文檔。這可以通過多種類型MIME(多功能網際郵件擴充協議)來完成。在HTTP中,MIME類型被定義在Content-Type header中。
例 如,架設你要傳送一個Microsoft Excel文件到客戶端。那么這時的MIME類型就是“application/vnd.ms-excel”。在大多數實際情況中,這個文件然后將傳送給 Execl來處理(假設我們設定Execl為處理特殊MIME類型的應用程序)。在Java中,設定MIME類型的方法是通過Response對象的ContentType屬性。比如常用:response.setContentType("text/html;charset=UTF-8")進行設置。
最早的HTTP協議中,并沒有附加的數據類型信息,所有傳送的數據都被客戶程序解釋為超文本標記語言HTML 文檔,而為了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。
每個MIME類型由兩部分組成,前面是數據的大類別,例如文本text、圖象image等,后面定義具體的種類。
常見的MIME類型:
超文本標記語言文本 .html,.html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF圖形 .gif image/gif
JPEG圖形 .ipeg,.jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
客戶程序從服務器上接收數據的時候,它只是從服務器接受數據流,并不了解文檔的名字,因此服務器必須使用附加信息來告訴客戶程序數據的MIME類型。
服務器在發送真正的數據之前,就要先發送標志數據的MIME類型的信息,這個信息使用Content-type關鍵字進行定義,例如對于HTML文檔,服務器將首先發送以下兩行MIME標識信息,這個標識并不是真正的數據文件的一部分。
Content-type: text/html
注意,第二行為一個空行,這是必須的,使用這個空行的目的是將MIME信息與真正的數據內容分隔開。
如前面所說,在Java中,設定MIME類型的方法是通過Response對象的ContentType屬性,設置的方法是使用response.setContentType(MIME)語句,response.setContentType(MIME)的作用是使客戶端瀏覽器,區分不同種類的數據,并根據不同的MIME調用瀏覽器內不同的程序嵌入模塊來處理相應的數據。
Tomcat的安裝目錄\conf\web.xml中就定義了大量MIME類型 ,可以參考。比如可以設置:
response.setContentType("text/html; charset=utf-8"); html
response.setContentType("text/plain; charset=utf-8"); 文本
application/json json數據
這個方法設置發送到客戶端的響應的內容類型,此時響應還沒有提交。給出的內容類型可以包括字符編碼說明,例如:text/html;charset=UTF-8。如果該方法在getWriter()方法被調用之前調用,那么響應的字符編碼將僅從給出的內容類型中設置。該方法如果在getWriter()方法被調用之后或者在被提交之后調用,將不會設置響應的字符編碼,在使用http協議的情況中,該方法設置 Content-type實體報頭。
四.使用$.ajax()方法獲取json數據的三種方式
dataType參數的配置決定了jquery如何幫助我們自動解析服務器返回的數據,有幾種方式可以獲取后臺返回的json字符串并解析為json對象,下面是Java為例解釋,下面三中方式的結果都是圖一所示,項目運行在內網,無法截圖,只能拍照,見諒。
1、$.ajax()參數中不設置dataType,后臺response也不設置返回類型,則默認會以普通文本處理【response.setContentType("text/html;charset=utf-8");也是作為文本處理】,js中需要手動使用eval()或$.parseJSON()等方法將返回的字符串轉換為json對象使用。
//Java代碼:后臺獲取單個數控定位器的歷史表格的數據 public void getHistorySingleData() throws IOException{ HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setContentType("text/html;charset=utf-8"); String deviceName = request.getParameter("deviceName"); String startDate= request.getParameter("startDate"); String endDate = request.getParameter("endDate"); SingleHistoryData[] singleHistoryData = chartService.getHistorySingleData(deviceName,startDate, endDate); System.out.println(singleHistoryData.length); System.out.println(JSONArray.fromObject(singleHistoryData).toString());//打印:[{"time":"2016-11-11 10:00:00","state":"運行","ball":"鎖緊",....},{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....},{},{}....]查到幾條singleHistoryData對象就打印幾個對象的信息{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....} response.getWriter().print(JSONArray.fromObject(singleHistoryData).toString()); }
/*js代碼:選擇查詢某一時間段的數據,點擊查詢之后進行顯示*/ $("#search").click(function () { var data1 = []; var n; var deviceName=$("body").attr("id"); var startDate = $("#startDate").val(); var endDate = $("#endDate").val(); $.ajax({ url:"/avvii/chart/getHistorySingleData", type:"post", data:{ "deviceName":deviceName, "startDate": startDate, "endDate": endDate }, success: function (data) { alert(data);//---->彈出[{"time":"2016-11-11 10:00:00","state":"運行","ball":"鎖緊",....},{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....},{},{}....],后臺傳過來幾條singleHistoryData對象就打印幾個對象的信息{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....} alert(Object.prototype.toString.call(data)); //--->彈出[object String],說明獲取的是String類型的數據 var JsonObjs = eval("(" + data + ")"); //或者:var JsonObjs = $.parseJSON(data); alert(JsonObjs);//alert(JsonObjs);---->彈出[object Object],[object Object],[object Object][object Object],[object Object],[object Object]……后臺傳過來幾條singleHistoryData對象就打印幾個[object Object] n=JsonObjs.length; if(n==0){ alert("您選擇的時間段無數據,請重新查詢"); } for(var i = 0; i < JsonObjs.length; i++){ var name = JsonObjs[i]['time'];//針對每一條數據:JsonObjs[i],或者:JsonObjs[i].time var state = JsonObjs[i]['state']; var ball = JsonObjs[i]['ball']; var xd = JsonObjs[i]['xd']; var yd = JsonObjs[i]['yd']; var zd = JsonObjs[i]['zd']; var xf = JsonObjs[i]['xf']; var yf = JsonObjs[i]['yf']; var zf = JsonObjs[i]['zf']; data1[i] = {name:name,state:state,ball:ball,xd:xd,yd:yd,zd:zd,xf:xf,yf:yf,zf:zf};//個數與下面表頭對應起來就可以了,至于叫什么名字并不影響控件的使用 } if(JsonObjs.length != 10){ for(var j=0;j<(10-((JsonObjs.length)%10));j++){ //補全最后一頁的空白行,使表格的長度保持不變 data1[j+JsonObjs.length] = {name:" ",state:"",ball:"",xd:"",yd:"",zd:"",xf:"",yf:"",zf:""}; } } var userOptions = { "id":"kingTable", //必須 表格id "head":["時間","運行狀態","球頭狀態","X向位置/mm","Y向位置/mm","Z向位置/mm","X向承載力/Kg","Y向承載力/Kg","Z向承載力/Kg"], //必須 thead表頭 "body":data1, //必須 tbody 后臺返回的數據展示 "foot":true, // true/false 是否顯示tfoot --- 默認false "displayNum": 10, //必須 默認 10 每頁顯示行數 "groupDataNum":6, //可選 默認 10 組數 sort:false, // 點擊表頭是否排序 true/false --- 默認false search:false, // 默認為false 沒有搜索 lang:{ gopageButtonSearchText:"搜索" } } var cs = new KingTable(null,userOptions); } }); });
2、$.ajax()參數中設置dataType="json",則jquery會自動將返回的字符串轉化為json對象。后臺可以設置為:【推薦】response.setContentType("text/html;charset=utf-8");或者response.setContentType("application/json;charset=utf-8");
//Java代碼:后臺獲取單個數控定位器的歷史表格的數據 public void getHistorySingleData() throws IOException{ HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setContentType("text/html;charset=utf-8"); String deviceName = request.getParameter("deviceName"); String startDate= request.getParameter("startDate"); String endDate = request.getParameter("endDate"); SingleHistoryData[] singleHistoryData = chartService.getHistorySingleData(deviceName,startDate, endDate); System.out.println(singleHistoryData.length); System.out.println(JSONArray.fromObject(singleHistoryData).toString());//打印:[{"time":"2016-11-11 10:00:00","state":"運行","ball":"鎖緊",....},{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....},{},{}....]查到幾條singleHistoryData對象就打印幾個對象的信息{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....} response.getWriter().print(JSONArray.fromObject(singleHistoryData).toString()); }
/*js代碼:頁面首次加載時,顯示規定時間段的數據*/ var data1 = []; var deviceName=$("body").attr("id"); var startDate = $("#startDate").val("2000-01-01 00:00:00"); var endDate = $("#endDate").val("2018-01-01 00:00:00"); $.ajax({ url:"/avvii/chart/getHistorySingleData", type:"post", data:{ "deviceName":deviceName, "startDate": "2000-01-01 00:00:00", "endDate": "2018-01-01 00:00:00" }, dataType:"json", success: function (data) { alert(data);//---->彈出[object Object],[object Object],[object Object][object Object],[object Object],[object Object]……后臺傳過來幾條singleHistoryData對象就打印幾個json對象:[object Object] for(var i = 0; i < data.length; i++){ var name = data[i]['time']; var state = data[i]['state']; var ball = data[i]['ball']; var xd = data[i]['xd']; var yd = data[i]['yd']; var zd = data[i]['zd']; var xf = data[i]['xf']; var yf = data[i]['yf']; var zf = data[i]['zf']; data1[i] = {name:name,state:state,ball:ball,xd:xd,yd:yd,zd:zd,xf:xf,yf:yf,zf:zf}; } if(data.length != 10){ for(var j=0;j<(10-((data.length)%10));j++){ //補全最后一頁的空白行,使表格的長度保持不變 data1[j+data.length] = {name:" ",state:"",ball:"",xd:"",yd:"",zd:"",xf:"",yf:"",zf:""}; } } var userOptions = { "id":"kingTable", //必須 表格id "head":["時間","運行狀態","球頭狀態","X向位置/mm","Y向位置/mm","Z向位置/mm","X向承載力/Kg","Y向承載力/Kg","Z向承載力/Kg"], //必須 thead表頭 "body":data1, //必須 tbody 后臺返回的數據展示 "foot":true, // true/false 是否顯示tfoot --- 默認false "displayNum": 10, //必須 默認 10 每頁顯示行數 "groupDataNum":6, //可選 默認 10 組數 sort:false, // 點擊表頭是否排序 true/false --- 默認false search:false, // 默認為false 沒有搜索 lang:{ gopageButtonSearchText:"搜索" } } var cs = new KingTable(null,userOptions); } });
3、ajax方法參數中不指定dataType,后臺設置返回類型為"application/json"。這樣jquery就會根據mime類型來智能判斷,并自動解析成json對象。
//Java代碼:后臺獲取單個數控定位器的歷史表格的數據 public void getHistorySingleData() throws IOException{ HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setContentType("application/json;charset=utf-8"); String deviceName = request.getParameter("deviceName"); String startDate= request.getParameter("startDate"); String endDate = request.getParameter("endDate"); SingleHistoryData[] singleHistoryData = chartService.getHistorySingleData(deviceName,startDate, endDate); System.out.println(singleHistoryData.length); System.out.println(JSONArray.fromObject(singleHistoryData).toString());//打印:[{"time":"2016-11-11 10:00:00","state":"運行","ball":"鎖緊",....},{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....},{},{}....]查到幾條singleHistoryData對象就打印幾個對象的信息{"time":"2016-11-11 10:00:05","state":"運行","ball":"鎖緊",....} response.getWriter().print(JSONArray.fromObject(singleHistoryData).toString()); }
/*js代碼:頁面首次加載時,顯示規定時間段的數據*/ var data1 = []; var deviceName=$("body").attr("id"); var startDate = $("#startDate").val("2000-01-01 00:00:00"); var endDate = $("#endDate").val("2018-01-01 00:00:00"); $.ajax({ url:"/avvii/chart/getHistorySingleData", type:"post", data:{ "deviceName":deviceName, "startDate": "2000-01-01 00:00:00", "endDate": "2018-01-01 00:00:00" }, success: function (data) { alert(data);//---->彈出[object Object],[object Object],[object Object][object Object],[object Object],[object Object]……后臺傳過來幾條singleHistoryData對象就打印幾個json對象:[object Object] for(var i = 0; i < data.length; i++){ var name = data[i]['time']; var state = data[i]['state']; var ball = data[i]['ball']; var xd = data[i]['xd']; var yd = data[i]['yd']; var zd = data[i]['zd']; var xf = data[i]['xf']; var yf = data[i]['yf']; var zf = data[i]['zf']; data1[i] = {name:name,state:state,ball:ball,xd:xd,yd:yd,zd:zd,xf:xf,yf:yf,zf:zf}; } if(data.length != 10){ for(var j=0;j<(10-((data.length)%10));j++){ //補全最后一頁的空白行,使表格的長度保持不變 data1[j+data.length] = {name:" ",state:"",ball:"",xd:"",yd:"",zd:"",xf:"",yf:"",zf:""}; } } var userOptions = { "id":"kingTable", //必須 表格id "head":["時間","運行狀態","球頭狀態","X向位置/mm","Y向位置/mm","Z向位置/mm","X向承載力/Kg","Y向承載力/Kg","Z向承載力/Kg"], //必須 thead表頭 "body":data1, //必須 tbody 后臺返回的數據展示 "foot":true, // true/false 是否顯示tfoot --- 默認false "displayNum": 10, //必須 默認 10 每頁顯示行數 "groupDataNum":6, //可選 默認 10 組數 sort:false, // 點擊表頭是否排序 true/false --- 默認false search:false, // 默認為false 沒有搜索 lang:{ gopageButtonSearchText:"搜索" } } var cs = new KingTable(null,userOptions); } });
注意:只要前臺或者后臺有一處設置了返回json對象,就無需使用eval()方法或$.parseJSON()方法解析了,再解析就出錯。
總結:以上幾種方式,推薦使用第二種方式,方便且不易出錯。
五.eval()方法
var json對象=eval('('+json數據+')');大括號括起來的內容被eval()執行后返回的是一個JSON對象。
eval函數的工作原理:eval函數會評估一個給定的含有JavaScript代碼的字符串,并且試圖去執行包含在字符串里的表達式或者一系列的合法的JavaScript語句。eval函數將把最后一個表達式或者語句所包含的值或引用作為返回值。
為什么要 eval這里要添加 “("("+data+")");//”呢?
原因在于:eval本身的問題。 由于json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將括號內的表達式(expression)轉化為對象,而不是作為語句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括號,那么eval會將大括號識別為JavaScript代碼塊的開始和結束標記,那么{}將會被認為是執行了一句空語句。
以上這篇基于$.ajax()方法從服務器獲取json數據的幾種方式總結就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。