欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

Ajax與JSON的一些學習總結_AJAX教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:ASP+AJAX+ACCESS數據庫實例講解三個步驟分享
其實說起AJAX的初級應用是非常簡單的,通俗的說就是客戶端(javascript)與服務端(asp或php等)腳本語言的數據交互

1.1.1 摘要
Ajax技術的核心是XMLHttpRequest對象(簡稱XHR),可以通過使用XHR對象獲取到服務器的數據,然后再通過DOM將數據插入到頁面中呈現。雖然名字中包含XML,但Ajax通訊與數據格式無關,所以我們的數據格式可以是XML或JSON等格式。

XMLHttpRequest對象用于在后臺與服務器交換數據,具體作用如下:

在不重新加載頁面的情況下更新網頁
在頁面已加載后從服務器請求數據
在頁面已加載后從服務器接收數據
在后臺向服務器發送數據

1.1.2 正文
XMLHttpRequest是一個JavaScript對象,它是由微軟設計,并且被Mozilla、Apple和Google采納,W3C正在標準化它。它提供了一種簡單的方法來檢索URL中的數據。

我們要創建一個XMLHttpRequest實例,只需new一個就OK了:
復制代碼 代碼如下:www.ghpqjb.com

//// Creates a XMLHttpRequest object.
var req = new XMLHttpRequest();

也許有人會說:“這可不行啊!IE6不支持原始的XHR對象”,確實是這樣,我們在后面將會介紹支持IE6或更老版本創建XHR對象的方法。

XMLHttpRequest的用法
在創建XHR對象后,接著我們要調用一個初始化方法open(),它接受五個參數具體定義如下:
復制代碼 代碼如下:www.ghpqjb.com

void open(
DOMString method, //"GET", "POST", "PUT", "DELETE"
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
);

通過上面的定義我們知道open()方法的簽名包含五個參數,其中有參數method和url地址是必填的,假設我們針對URL: myxhrtest.aspx發送GET請求獲取數據,具體定義如下:
復制代碼 代碼如下:www.ghpqjb.com

var req = new XMLHttpRequest();
req.open(
"GET",
"myxhrtest.aspx",
false
);

通過上述代碼會啟動一個針對myxhrtest.aspx的GET請求,這里有兩點要注意:一是URL相對于執行代碼的當前頁面(使用絕對路徑);二是調用open()方法并不會真正發送請求,而只是啟動一個請求準備發送。

只能向同一個域中使用相同端口和協議的URL中發送請求;如果URL與啟動請求的頁面有任何差別,都會引發安全錯誤。

要真正發送請求要使用send()方法,send()方法接受一個參數,即要作為請求主體發送的數據,如果不需要通過請求主體發送數據,我們必須傳遞一個null值。在調用send()之后,請求就會被分派到服務器,完整Ajax請求代碼如下:
復制代碼 代碼如下:www.ghpqjb.com

var req = new XMLHttpRequest();
req.open(
"GET",
"myxhrtest.aspx",
false
);
req.send(null);

在發送請求之后,我們需要檢查請求是否執行成功,首先可以通過status屬性判斷,一般來說,可以將HTTP狀態代碼為200作為成功標志。這時,響應主體內容會保存到responseText中。此外,狀態代碼為304表示請求的資源并沒有被修改,可以直接使用瀏覽器緩存的數據,Ajax的同步請求代碼如下:
復制代碼 代碼如下:www.ghpqjb.com

if (req != null) {
req.onreadystatechange = function() {
if ((req.status >= 200 && req.status < 300) || req.status == 304) {
//// Do something.
}
else {
alert("Request was unsuccessful: " + req.status);
}
};
req.open("GET", "www.myxhrtest.aspx", true);
req.send(null);
}

前面我們定義了Ajax的同步請求,如果我們發送異步請求,那么在請求過程中javascript代碼會繼續執行,這時可以通過readyState屬性判斷請求的狀態,當readyState = 4時,表示收到全部響應數據,屬性值的定義如下:

readyState值

描述

0

未初始化;尚未調用open()方法

1

啟動;尚未調用send()方法

2

已發送;但尚未收到響應

3

接收;已經收到部分響應數據

4

完成;收到全部響應數據

表1 readyState屬性值

同步請求:發生請求后,要等待服務器執行完畢才繼續執行當前代碼。

異步請求:發生請求后,無需等到服務器執行完畢,可以繼續執行當前代碼。

現在我們要增加判斷readyState屬性值,當readyState = 4時,表示全部數據接收完成, 所以Ajax的異步請求代碼如下:
復制代碼 代碼如下:www.ghpqjb.com

if (req != null) {
req.onreadystatechange = function() {

//// Checks the asyn request completed or not.
if (req.readyState == 4) {
if ((req.status >= 200 && req.status < 300) || req.status == 304) {
//// Do something.
}
else {
alert("Request was unsuccessful: " + req.status);
}
}
};
req.open("GET", "www.myxhrtest.aspx", true);
req.send(null);
}

Ajax同源請求
現在我們對Ajax的請求實現有了初步的了解,接下來我們將通過具體的例子說明Ajax請求的應用場合和局限。

在日常網絡生活中,我們在瀏覽器的地址中輸入要訪問的URL并且回車,瀏覽器會向服務器發送請求,當服務器收到請求后,把相應的請求頁面發送回瀏覽器,我們會發現頁面大部分加載完畢,有些還沒有加載完畢。總得來說,采用異步加載方式不會影響已加載完畢的頁面瀏覽,我們可以通過Ajax實現異步加載。

這里我們以AdventureWorks數據庫為例,把產品表(Product)中的數據通過報表呈現給用戶,我們可以通過多種方法實現該報表需求,這里我們將通過Ajax實現該功能。

首先,我們要把后臺數據轉換為JSON格式,接下來我們定義Product表的數據庫訪問對象(DAO),具體的實現代碼如下:
復制代碼 代碼如下:www.ghpqjb.com

/// <summary>
/// The product datatable dao.
/// </summary>
public class ProductDao
{
/// <summary>
/// Initializes a new instance of the <see cref="ProductDao"/> class.
/// </summary>
public ProductDao()
{
}

/// <summary>
/// Gets or sets the product id.
/// </summary>
public int Id { get; set; }

/// <summary>
/// Gets or sets the product name.
/// </summary>
public string Name { get; set; }

/// <summary>
/// Gets or sets the product serial number.
/// </summary>
public string SerialNumber { get; set; }

/// <summary>
/// Gets or sets the product qty.
/// </summary>
public short Qty { get; set; }
}

前面我們定義了Product表的數據庫訪問對象——ProductDao,它包含四個屬性分別是產品的Id,名稱,序列號和銷售數量。

接下來,讓我們實現Product表的數據庫操作類。
復制代碼 代碼如下:www.ghpqjb.com

/// <summary>
/// Product table data access manager.
/// </summary>
public class ProductManager
{
/// <summary>
/// The query sql.
/// </summary>
private const string Query =
"SELECT ProductID, Name, ProductNumber, SafetyStockLevel FROM Production.Product";

/// <summary>
/// Stores the object of <see cref="ProductDao"/> into list.
/// </summary>
private IList<ProductDao> _products = new List<ProductDao>();

/// <summary>
/// Gets all products in product table.
/// </summary>
/// <returns>
/// The list of <see cref="ProductDao"/> object.
/// </returns>
public IList<ProductDao> GetAllProducts()
{
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN"].ToString()))
using (var com = new SqlCommand(Query, con))
{
con.Open();
using (var reader = com.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
var product = new ProductDao
{
Id = (int)reader["ProductID"],
Name = (string)reader["Name"],
SerialNumber = (string)reader["ProductNumber"],
Qty = (short)reader["SafetyStockLevel"]
};
_products.Add(product);
}
}
}

return _products;
}
}

前面我們實現了Product表的數據庫操作類——ProductManager,它包含兩個私有字段Quey和_products,還有一個獲取Product表中數據的方法——GetAllProducts()。

通過實現ProductDao和ProductManager,而且我們提供GetAllProducts()方法,獲取Product表中的數據,接下來我們要調用該方法獲取數據。

為了使數據通過JSON格式傳遞給頁面,這里我們要創建一般處理程序(ASHX文件),

一般處理程序適用場合:

創建動態圖片
返回REST風格的XML或JSON數據
自定義HTML

ajax1

圖1一般處理程序

把一般處理程序文件添加到項目中時,會添加一個擴展名為.ashx的文件,現在我們創建一個一般處理程序ProductInfo,具體代碼如下:

復制代碼 代碼如下:www.ghpqjb.com

<%@ WebHandler Language="C#" Class="ProductInfo" %>
using System.Runtime.Serialization.Json;
using System.Web;
using ASP.App_Code;
/// <summary>
/// The product data handler.
/// </summary>
public class ProductInfo : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "application/json";
// Creates a <see cref="ProductManager"/> oject.
var manager = new ProductManager();
// Invokes the GetAllProducts method.
var products = manager.GetAllProducts();
// Serializes data to json format.
var json = new DataContractJsonSerializer(products.GetType());
json.WriteObject(context.Response.OutputStream, products);
}
// Whether can resuable by other handler or not.
public bool IsReusable {
get {
return false;
}
}
}

大家注意到ProductInfo類實現了IHttpHandler接口,該接口包含一個方法ProcessRequest()方法和一個屬性IsReusable。ProcessRequest()方法用于處理入站的Http請求。在默認情況下,ProductInfo類會把內容類型改為application/json,然后我們把數據通過JSON格式寫入輸入流中;IsReusable屬性表示相同的處理程序是否可以用于多個請求,這里我們設置為false,如果為了提高性能也可以設置為true。
如下圖所示,我們通過ProductInfo類成功地實現獲取數據到響應流中,并且以JSON格式顯示出來。

ajax2

圖2 Http請求
當我們請求ProductInfo時, 首先它會調用ProcessRequest()方法,接著調用GetAllProducts()方法從數據庫中獲取數據,然后把數據通過JSON格式寫入到響應流中。
現在,我們已經成功地把數據通過JSON格式寫入到響應流當中,接著我們將通過Ajax方式請求數據并且把數據顯示到頁面中。
首先,我們定義方法createXHR()用來創建XMLHttpRequest對象,前面我們提到IE6或者更老的版本不支持XMLHttpRequest()方法來創建XMLHttpRequest對象,所以我們要在createXHR()方法中,增加判斷當前瀏覽器是否IE6或更老的版本,如果是,就要通過MSXML庫的一個ActiveX對象實現。因此,在IE中可能遇到三種不同版本的XHR對象(MSXML2.XMLHttp6.0,MSXML2.XMLHttp3.0和MSXML2.XMLHttp)。
復制代碼 代碼如下:www.ghpqjb.com

// Creates a XMLHttpRequest object bases on web broswer.
function createXHR() {
// Checks whether support XMLHttpRequest or not.
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
}
// IE6 and elder version.
else if (typeof ActiveXObject != "undefined") {
if (typeof arguments.callee.activeXString != "string") {
var versions = [
"MSXML2.XMLHttp6.0",
"MSXML2.XMLHttp3.0",
"MSXML2.XMLHttp"];
for (var i = 0; i < versions.length; i++) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
}
catch (ex) {
throw new Error(ex.toString());
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
else {
throw new Error("No XHR object available");
}
}
return null;
}
$(document).ready(function() {
GetDataFromServer();
});

前面我們定義了一個比較通用的方法用來創建XMLHttpRequest對象,并且它支持IE6或更老版本創建XMLHttpRequest對象,接下來我們將通過Ajax方法請求數據。
復制代碼 代碼如下:www.ghpqjb.com

function GetDataFromServer() {
// Creates a XMLHttpRequest object.
var req = new createXHR();
if (req != null) {
req.onreadystatechange = function() {
if (req.readyState == 4) {
if ((req.status >= 200 && req.status < 300) || req.status == 304) {
////alert(req.responseText);
var jsonTextDiv = document.getElementById("jsonText");
// Deserializes JavaScript Object Notation (JSON) text to produce a JavaScript value.
var data = JSON.parse(req.responseText);
for (var i = 0; i < data.length; i++) {
var item = data[i];
var div = document.createElement("div");
div.setAttribute("class", "dataItem");
// Inserts data into the html.
div.innerHTML = item.Name + " sold " + item.Qty + "; Product number: " + item.SerialNumber;
jsonTextDiv.appendChild(div);
}
}
else {
alert("Request was unsuccessful: " + req.status);
}
}
};
// Sends a asyn request.
req.open("GET", "ProductInfo.ashx", true);
req.send(null);
}
}

由于前面我們介紹過Ajax發生請求的方法,所以不再重復介紹了,但我們注意到GetDataFromServer()方法中,獲取responseText數據(JSON格式),然后通過parse()方法把JSON格式數據轉換為Javascript對象,最后把數據插入到div中,頁面呈現效果如下:

ajax3

圖3 Ajax請求結果

現在,我們成功地把數據輸出到頁面當中,也許用戶還會覺得用戶體驗不好,那么我們給就該頁面增加CSS樣式。

由于時間的關系,我們已經把CSS樣式定義好了,具體如下:
復制代碼 代碼如下:www.ghpqjb.com

#header {
width: 100%;
margin-left: 10px;
margin-right: 10px;
background-color:#480082;
color: #FFFFFF;
}
body {
margin-left: 40px;
margin-right: 40px;
}
div#jsonText {
background-color: #d9d9d9;
-webkit-border-radius: 6px;
border-radius: 6px;
margin: 10px 0px 0px 0px;
padding: 0px;
border: 1px solid #d9d9d9;
}
div.dataItem {
font-family: Verdana, Helvetica, sans-serif;
color: #434343;
padding: 10px;
}
div.dataItem:nth-child(2n) {
background-color: #fafafa;
}
div.dataItem:first-child {
-webkit-border-top-left-radius: 6px;
-webkit-border-top-right-radius: 6px;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}
div.dataItem:last-child {
-webkit-border-bottom-left-radius: 6px;
-webkit-border-bottom-right-radius: 6px;
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
}

我們刷新一下頁面,OK現在頁面效果好多了。

ajax4

圖4 Ajax請求結果

同源策略與跨源策略
上面我們獲取頁面和數據都是在同源請求情況下,也就是說,客戶端瀏覽器請求的頁面和數據都是屬于同一域名、同一端口和同協議。

同源策略:阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的URL的域必須與當前Web頁面的域相同、相同端口。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。

ajax6



圖5同源請求過程

在一些情況下,我們不可以避免地要地需要從其他域名或服務器中跨域請求數據,但前面提到Ajax只能向同一個域中使用相同端口和協議的URL中發送請求;如果URL與啟動請求的頁面有任何差別,都會引發安全錯誤。

跨源策略(CORS):是一個Web瀏覽器技術規范,它定義了一個方法讓Web服務器允許其他域名頁面訪問它的資源。跨源策略定義了一個方法讓瀏覽器和服務器可以交互決定是否允許跨源請求。

圖6跨源請求過程

大家注意到同源請求中我們使用的是JSON格式,但在跨源請求中卻是使用JSONP,這時大家可能有點困惑,坦然我剛開始學習的時候也是這樣的。

首先我們必須理解JSON和JSONP的區別:JSON是一種數據格式,而JSONP像是通過一個方法名來封裝JSON格式;由于瀏覽器允許跨源請求<script>資源,如我們的HTML頁面代碼中使用了Google的jQuery庫,當我們Web程序發送跨源請求后,服務器給我們提供響應數據,但服務器無法預知接受JSON數據的方法名,所以我們要提供一個方法名。

Ajax跨源請求
跨域請求數據解決方案主要有如下解決方法:

JSONP方式
表單POST方式
服務器代理
Html5的XDomainRequest
Flash request
在介紹JSONP方式解決跨域請求數據之前,首先我們看看JSONP的定義。

JSONP(JSON with Padding)是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過Javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。

由于同源策略的限制,XMLHttpRequest只允許請求當前源(域名、協議、端口)的資源,為了實現跨域請求,可以通過script標簽實現跨域請求,然后在服務端輸出JSON數據并執行回調函數,從而解決了跨域的數據請求。

假設博客園提供一個API接口:http://www.cnblogs.com/hotblogs/json?,供開發者調用獲取熱門博文。

這里我們可以通過兩種方式調用該接口:

1. 用Javascript定義回調函數
其實,通過Javascript定義回調函數調用該接口比較直觀,我們只需告訴服務器接收數據的方法名就OK了,比如:

http://www.cnblogs.com/hotblogs/json? callback=myFunction

其中myFunction是我們在頁面自定義的函數用來接收服務器回傳的數據,myFunction的定義如下:
復制代碼 代碼如下:www.ghpqjb.com

// The call back function.
function myFunction(data) {
// Your code here.
}

2. 使用jQuery的Ajax方法
假設我們想在博客中增加顯示浪微博的公共微博信息,我們可以在博客中調用微博提供的API獲取跨源數據,接下來,我們將使用jQuery的Ajax方法獲取跨域數據。

首先,查看微博API文檔找到了公共微博的API接口statuses/public_timeline 獲取最新的公共微博消息,它支持JSON或XML格式數據。

參數

必選

類型及范圍

說明

source

true

string

申請應用時分配的AppKey,調用接口時候代表應用的唯一身份。(采用OAuth授權方式不需要此參數)

count

false

int,缺省值20,最大值200

每次返回的記錄數

count

false

int,缺省值20,最大值200

每次返回的記錄數

表2請求參數

上面的請求參數只有source(AppKey)是必須的,所以我們需要向微博申請AppKey,在調用API時,只需把我們的AppKey傳遞給接口就OK了。

接下來讓我們看一下微博數據組成,這里我們使用JSON viewer查看微博的數據組成,具體數據如下:

ajax8

圖7微博JSON數據

通過上圖,我們知道微博的數據信息很豐富,它是由一些基礎數據類型和復雜數據類型user組成的,接下來我們將使用jQuery實現調用微博接口方法。
首先,我們定義一個全局的對象,它包含三個屬性分別是:numWeibo、appendTo和appKey,還有三個方法loadWeibo()、timeAgo()和clean(),具體定義如下:
復制代碼 代碼如下:www.ghpqjb.com

JQWeibo = {
// The number of weibos display in the page.
// Sets the number of weibos, append class and app key.
numWeibo: 15,
appendTo: '#jsWeibo',
// The appkey you apply from weibo.
appKey: YourAppKey,
// The function to get weibo data.
loadWeibo: function() {
},
/**
* Convert the time to relative time.
* @return {string} relative time like "8 minutes ago"
*/
timeAgo: function(dateString) {
},
ify: {
clean: function(weibo) {
return this.hash(this.at(this.list(this.link(weibo))));
}
} // ify
};

上面我們定義了一個對象JQWeibo,其中loadWeibo()方法使用jQuery的Ajax方法向微博API發送跨源請求,接下來讓我們實現該方法吧。
復制代碼 代碼如下:www.ghpqjb.com

// The function to get weibo data.
loadWeibo: function() {
$.ajax({
// Weibo API.
url: "http://api.t.sina.com.cn/statuses/public_timeline.json",
type: "GET",
dataType: "jsonp",
data: {
source: JQWeibo.appKey,
count: JQWeibo.numWeibo
},
// When the requet completed, then invokes success function.
success: function(data, textStatus, xhr) {
// Sets html structure.
var html =
'<div class="weibo">' +
'<a target="_blank">USER</a>' +
':WEIBO_TEXT<div class="time">AGO</div>';
// Appends weibos into html page.
for (var i = 0; i < data.length; i++) {
$(JQWeibo.appendTo).append(
html.replace('WEIBO_TEXT', JQWeibo.ify.clean(data[i].text))
// Uses regex and declare DOMAIN as global, if found replace all.
.replace(/DOMAIN/g, data[i].user.domain)
.replace(/USER/g, data[i].user.screen_name)
.replace('AGO', JQWeibo.timeAgo(data[i].created_at))
);
}
}
})
}

現在,我們使用$.ajax()方法向微博API發送跨源請求,而且我們向API傳遞了JQWeibo.appKey和JQWeibo.numWeibo,當請求完成后,調用Success()方法把JSON數據插入的頁面當中。
頁面的HTML代碼如下:
復制代碼 代碼如下:www.ghpqjb.com

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Weibo Feed</title>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.6.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/WeiboFeed.css">
</head>
<body>
<div id="jsWeibo"></div>
</body>
</html>

ajax9
圖8 跨源數據
如上圖所示,我們使用$.ajax()方法調用公共微博接口,當成功獲取服務器回調數據插入到我們的頁面當中。
1.1.3 總結
本文主要介紹了Ajax在同源請求適用性,但在跨源請求中其存在的局限性,進而介紹Ajax和JSONP在跨源請求下解決方法。
回答qianlifeng關于跨源請求的幾個問題:
1.一般的跨源不用jsonp請求為什么會報錯?和同源的不都是一個請求么?(可能對ajax了解不深)
答:首先跨源請求的解決方法不僅僅有JSON,本文中提及了其他方法,如:表單POST方式、服務器代理、Html5的XDomainRequest和Flash request等;而你提到報錯,我覺得你首先要確認數據格式是否正確。關于跨原請求和同源請求本文已經給出了介紹。
2.關于“用Javascript定義回調函數”那塊看的不是很明白。傳遞當前頁面的一個js方法給跨源服務器,為什么就能跨源請求了呢?(JSONP?) 服務端根據這個js方法做了什么操作啊?
答:首先我們理解JSON是一種數據格式,而JSONP像似通過一個方法名來封裝JSON格式;而跨源請求不是說指定一個回調函數實現的,而是我們利用了瀏覽器允許跨源請求<script>資源,你也可以我的HTML代碼中使用的是Google提供的jQuery庫,這也說明了<script>資源可以跨源請求。當我們發送跨源請求后,服務器會返回JSONP,但服務器無法預知接受JSON數據的方法名,所有我們要把函數名告訴(傳遞)服務器。
復制代碼 代碼如下:www.ghpqjb.com

//JSON
{"name":"JK_Rush","id":23}
//JSONP
func({"name":"JK_Rush","id":23});

3.看你新浪微博的那個例子,是jquery的ajax對跨源做了處理?能不能說說您提到的兩種跨源方式的區別或者不同的應用場景,還是隨便都一樣?
答:是通過$.ajax()方法實現的,如果你想使用動態Javascript實現也可以;至于兩種跨源的區別已經在博文中指出了。
回答@On the road....關于JSON反序列化為對象的實現:
答:一般我們可以通過三種方法把JSON數據反序列化為對象,分別是:ASP.NET AJAX中引入的JavaScriptSerializer,WCF中引入的DataContractJsonSerializer,以及Json.NET。
假設,我們獲取到員工信息(employee)的JSON數據,它包含兩個屬性分別是id和復雜屬性name,具體如下所示:
復制代碼 代碼如下:www.ghpqjb.com

[
{
"id": "82105",
"name": {
"lastName": "Huang",
"firstName": "JK"
}
},
{
"id": "82106",
"name": {
"lastName": "Leung",
"firstName": "Cindy"
}
}
]
string data = "[{\"id\":\"82105\",\"fullname\":{\"lastName\":\"Huang\",\"firstName\":\"JK\"}}," +
"{\"id\":\"82106\",\"fullname\":{\"lastName\":\"Leung\",\"firstName\":\"Cindy\"}}]";

根據上述JSON數據的組成,我們定義出相應的對象模型,具體定義如下:
復制代碼 代碼如下:www.ghpqjb.com

// The Employee model.
public class Employee
{
public int Id { get; set; }
public Name FullName { get; set; }
}
// The Name model.
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

接下來,我們將介紹使用JavaScriptSerializer,Json.NET和DataContractJsonSerializer反序列化JSON數據為對象。
JavaScriptSerializer
復制代碼 代碼如下:www.ghpqjb.com

var serializer = new JavaScriptSerializer();
var employees= serializer.Deserialize<Employee[]>(data);Json.NET
using (var stringReader = new StringReader(data))
using (var jsonTextReader = new JsonTextReader(stringReader))
{
var serializer = new JsonSerializer();
var employees = serializer.Deserialize<Employee[]>(jsonTextReader);
}

DataContractJsonSerializer
對于使用WCF的DataContractJsonSerializer方法,我們需要在對象模型添加DataContract和DataMember屬性,具體定義如下:
復制代碼 代碼如下:www.ghpqjb.com

[DataContract]
public class Employee
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "fullname")]
public Name FullName { get; set; }
}
[DataContract]
public class Name
{
[DataMember(Name = "firstName")]
public string FirstName { get; set; }
[DataMember(Name = "lastName")]
public string LastName { get; set; }
}

接著我們使用ReadObjects()方法把JSON數據轉換為對象。
復制代碼 代碼如下:www.ghpqjb.com

using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<Employee>));
var employee = (List<Employee>)serializer.ReadObject(ms);
}


參考






分享:Ajax請求中的異步與同步,需要注意的地方說明
默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行

來源:模板無憂//所屬分類:AJAX教程/更新時間:2013-04-22
相關AJAX教程
日韩激情毛片| 91香蕉视频在线播放| 无码精品视频一区二区三区| 一区精品久久| 欧美日韩精品在线播放| 日本一区二区三区在线播放| 国产一级片黄色| 中文字字幕在线中文乱码| 99久久夜色精品国产亚洲狼| 亚洲欧美福利一区二区| 欧美极品在线视频| 少妇高清精品毛片在线视频| 91 中文字幕| 亚洲午夜av| 欧美性受xxxx黑人xyx性爽| 成人亚洲激情网| 大桥未久恸哭の女教师| 色综合天天色| 粉嫩欧美一区二区三区高清影视| 亚洲精品中文字| 一区国产精品| 国产精品久免费的黄网站| 三区四区不卡| 精品欧美一区二区三区| 国产有码一区二区| 少妇户外露出[11p]| 亚洲精品伊人| 99精品久久只有精品| www.色综合| 中文字幕乱码人妻综合二区三区 | 亚洲欧美成人精品| 欧美性受黑人性爽| 波多野结衣视频免费观看| 国产精品啊啊啊| 欧美三级乱人伦电影| 国内精品久久国产| 天天看片中文字幕| 四季av在线一区二区三区| 欧美日韩一区二区免费视频| 亚洲一区二区三区xxx视频| 亚洲精品国产一区黑色丝袜| 澳门成人av| 亚洲人成影院在线观看| 国产精品久久久久免费a∨| 老熟妇精品一区二区三区| 精品国产不卡一区二区| 欧美极品另类videosde| 91av视频在线免费观看| 永久看看免费大片| 四虎国产精品永久在线国在线| 91蜜桃免费观看视频| 欧美多人爱爱视频网站| 在线视频日韩欧美| 亚洲ww精品| 国产农村妇女精品| 国产成人在线播放| 久久精品无码一区| 国产成人调教视频在线观看| 欧美日韩综合视频| 精品一区日韩成人| 亚洲黄色一区二区| 最新日韩av| 精品国产精品网麻豆系列| 精品国产无码在线| 91免费视频播放| 狠狠色综合色综合网络| 日韩在线视频观看| 五月天激情播播| 国产精品久久久久久久久久久久久久久 | 在线免费观看av网址| 久久久久久黄| 亚洲天堂影视av| 搡女人真爽免费午夜网站| 久久久成人av毛片免费观看| 国产欧美一区二区三区沐欲| 国产精品一区二区免费不卡| 久久精品夜色噜噜亚洲a∨| 8x海外华人永久免费日韩内陆视频| 午夜视频在线观看国产| 日韩福利视频一区| 色婷婷综合久久久久中文| 日本亚洲自拍| 国产一区二区三区在线观看| 国产综合久久久久久久久久久久| 久久中文字幕国产| 日本一区二区免费视频| 神马久久影院| 欧美亚洲免费在线一区| 正义之心1992免费观看全集完整版| 伊人精品一区二区三区| 国产精品中文字幕日韩精品| 欧美激情精品久久久久久蜜臀 | 日韩av片永久免费网站| www.av天天| 91精品国产91久久综合| 亚洲精品一区二区三区在线观看| 激情综合网婷婷| 久久免费资源| 亚洲成人tv网| 亚洲va久久久噜噜噜久久狠狠| 国产日韩一级片| www.欧美亚洲| 国产美女扒开尿口久久久| 国产精品成人免费观看| 亚洲欧美日韩国产一区二区| 自拍偷拍亚洲区| 国产高潮失禁喷水爽到抽搐| 超碰成人久久| 亚洲第一页自拍| 在线观看亚洲色图| 欧美毛片免费观看| 欧美一区二区在线播放| 国产一区视频免费观看| 粉嫩一区二区三区四区公司1| 欧美影院一区二区三区| 丰满的少妇愉情hd高清果冻传媒 | 国产图片一区| 欧美日韩在线播放| 91丨porny丨探花| 一区二区三区日本视频| 欧美日韩一区二区三区| 日韩精品免费一区| 久久久久伊人| 日韩欧美aaa| 女人被男人躁得好爽免费视频| 亚洲成av在线| 精品欧美国产一区二区三区| 激情五月五月婷婷| jizz免费一区二区三区| 欧美视频第一页| 国产免费一区二区视频| 国产人妖一区| 在线一区二区三区四区五区| www.好吊操| 久久精品一级| 欧美高清精品3d| 91日韩视频在线观看| 婷婷综合成人| 亚洲国产成人爱av在线播放| 亚洲成人av免费观看| 99热精品久久| 久久精品99久久久久久久久| 中文字幕 自拍| 日韩中文字幕区一区有砖一区 | 国产无遮挡一区二区三区毛片日本| 国产成人精品免费视频大全最热| 国产一区二区三区四区视频| 国产精品美日韩| 亚洲精品一区二区毛豆| 人人鲁人人莫人人爱精品| 懂色av一区二区三区| 国产精品又粗又长| 成人在线视频你懂的| 精品国产制服丝袜高跟| 亚洲欧美日韩一二三区| 99久久www免费| 最新国产精品拍自在线播放 | 日韩av电影网址| 成人一区二区三区中文字幕| 3d蒂法精品啪啪一区二区免费| 99久久婷婷国产一区二区三区| 亚洲少妇最新在线视频| 男同互操gay射视频在线看| 91久久青草| 91精品国产免费久久综合| 超碰人人草人人| 精品国产一区三区| 久久不见久久见免费视频7| 亚洲美女av黄| 亚洲综合第一区| 精品亚洲国内自在自线福利| 成人免费大片黄在线播放| 一区二区三区精| 一区二区日韩av| 日本丰满少妇xxxx| 精品国产aⅴ| 精品国产美女在线| 欧美成人aaa片一区国产精品| 国产99精品国产| 精品人伦一区二区三区| 欧美123区| 7777女厕盗摄久久久| 日本一级大毛片a一| 国产精品色网| 国产精品情侣自拍| 国产成人麻豆精品午夜在线 | 久久精品男女| 成人妇女淫片aaaa视频| 精品人妻一区二区三区三区四区 | 美女视频网站黄色亚洲| 91美女高潮出水| 可以免费看毛片的网站| 色哟哟在线观看一区二区三区| 性chinese极品按摩| 永久亚洲成a人片777777| 性欧美在线看片a免费观看 | 日本中文字幕一区二区有限公司| 成人在线视频网| 色婷婷av一区二区三区之红樱桃| 91福利资源站| 四虎国产精品免费| 日韩国产欧美三级| 91精品久久香蕉国产线看观看| 五月婷婷激情在线| 在线成人小视频| 日本黄色特级片| 国产精品自拍三区| 欧美亚洲免费高清在线观看| 久久久国产精品入口麻豆| 亚洲毛片一区二区| 9999热视频| 国产日韩视频一区二区三区| 久久久天堂国产精品| 国产99久久久国产精品成人免费 | 在线成人激情| 国产精品69精品一区二区三区| 97在线视频人妻无码| 色综合咪咪久久| 极品白嫩少妇无套内谢| 久久国产精品99久久人人澡| 久久资源亚洲| 岛国成人av| 久久精品夜夜夜夜夜久久| 国产污污视频在线观看| 亚洲综合免费观看高清在线观看| 午夜欧美福利视频| 亚洲综合电影一区二区三区| 99精彩视频| 日本亚洲欧洲无免费码在线| 亚洲精品天天看| 久久久久成人精品无码| 亚洲天堂精品视频| 奇米影音第四色| 久久激情综合| 黄色99视频| 风间由美性色一区二区三区四区| www国产精品com| 波多野结衣视频观看| 色悠久久久久综合欧美99| 白嫩情侣偷拍呻吟刺激| 成人免费高清视频| 日韩国产小视频| 欧美日一区二区在线观看 | 日韩成人影音| 亚洲欧美日韩爽爽影院| 狠狠躁夜夜躁人人爽天天高潮| 亚洲五码中文字幕| 91精产国品一二三| 成人一区在线观看| 国产精品久久久久久久乖乖| 中文字幕人成人乱码| 亚洲va电影大全| 日本精品在线观看| 色综合视频一区中文字幕| 99精品人妻无码专区在线视频区| 欧美一级视频精品观看| 国产稀缺精品盗摄盗拍| 亚洲欧美偷拍另类a∨色屁股| 久久久久久久久久一区二区| 九九九久久久精品| 影音先锋在线亚洲| 亚洲成人精品| 99porn视频在线| 亚洲精品一区二区三区在线| 色综合久综合久久综合久鬼88 | 老太脱裤让老头玩ⅹxxxx| 最新成人av网站| 蜜桃久久精品乱码一区二区 | 国产熟女高潮视频| 日韩激情av在线| 亚洲精品无人区| 午夜日韩激情| 国内精品**久久毛片app| 国产成人精品免费视| 国产精品一区二区性色av| 精品精品视频| 久久久中精品2020中文| 午夜福利一区二区三区| 国产一区二区免费| 国产欧美一级片| 亚洲国产精品成人av| 黄色片中文字幕| 欧美人妖巨大在线| 免费在线一级片| 日本韩国精品在线| 色欲一区二区三区精品a片| 亚洲国产成人av网| a毛片毛片av永久免费| 国产精品久久久久久久久晋中| a级大片免费看| 久久久www成人免费无遮挡大片| 校园春色 亚洲色图| 国产成人a级片| 日韩亚洲在线视频| 国产乱淫av一区二区三区| 精品久久一二三| 久久黄色级2电影| 激情五月婷婷六月| 日韩av一级片| 久久久久久www| 免费成人在线观看| 国产伦精品一区二区三区四区视频_| 久久久噜噜噜| 日本福利视频在线观看| 天堂久久一区二区三区| 91传媒免费视频| 日产欧产美韩系列久久99| 国产激情片在线观看| 日韩二区三区四区| 欧美日韩视频免费| 美女视频第一区二区三区免费观看网站| 波多野结衣与黑人| 久久久久久久波多野高潮日日| 午夜久久久久久久久久久| 久久久久久久高潮| 国产一线二线三线女| 久久99精品久久只有精品| 日本三级免费网站| 丰满亚洲少妇av| 伊人免费视频二| 国产亚洲婷婷免费| 成人在线视频免费播放| 一区二区三区在线视频播放| 91麻豆制片厂| 色综合久久久久久久久久久| 久久久精品一区二区涩爱| 欧美日韩国产首页在线观看| 久久精品视频1| 欧美精品一区二区三区在线| 国产日本精品视频| 按摩亚洲人久久| 亚洲ww精品| 国产精品毛片a∨一区二区三区|国| 美女网站色精品尤物极品姐弟| 114国产精品久久免费观看| 91久久国产| 亚洲欧美日韩国产成人综合一二三区| 六月丁香综合| 久久艹国产精品| 国产91丝袜在线18| 久久艹这里只有精品| 亚洲欧美在线aaa| 人妻无码一区二区三区免费| 在线精品视频小说1| 色婷婷在线观看视频| 亚洲国产成人精品久久久国产成人一区| 国产又大又黄的视频| 日韩中文有码在线视频| 国产美女久久| 国产区精品视频| 91视频综合| 一区二区三区我不卡| 麻豆精品一二三| www.精品在线| 亚洲女人小视频在线观看| 国产一区第一页| 777亚洲妇女| 性生活三级视频| 久久久久亚洲精品成人网小说| 超碰97久久国产精品牛牛| 福利视频一区二区三区| 国产精品日韩精品欧美精品| 999香蕉视频| 国产精品无遮挡| 日韩国产第一页| 日韩精品一区二区三区在线观看 | 97人妻精品一区二区三区软件| 久久久精品视频成人| 欧美经典一区| 国产欧美丝袜| 天堂av在线一区| 五月天视频在线观看| 一区二区三区在线观看视频| 久久久久99精品| 亚洲欧美成人网| 九九九精品视频| 99re在线视频观看| 亚洲视频二区| 鲁一鲁一鲁一鲁一av| 亚洲综合视频网| 中文字幕国产在线观看| 中文字幕精品视频| 超碰97久久| 水蜜桃一区二区三区| 国产福利精品导航| 日韩精品卡通动漫网站| 欧美视频一区二区在线观看| 国产高潮流白浆喷水视频| 2019中文字幕在线免费观看| 日韩av片专区| 国产丝袜美腿一区二区三区| 少妇高潮在线观看| 亚洲国产成人一区| 91精品国产经典在线观看| 成人黄色在线免费观看| 三级欧美韩日大片在线看| 国产资源中文字幕| 欧美视频免费在线观看| 一区二区日韩在线观看| 欧美一性一乱一交一视频|