最近在做公司的一個project,其中有一部分,要求瀏覽器端通過jquery ajax調(diào)用服務(wù)器端返回json格式的多條數(shù)據(jù)。網(wǎng)上搜索了一下,找到下面兩個方法在.NET中生成json。
方法一:.NET Framework 3.0及更早的版本:
public static string GetJSONString(DataTable Dt){ string[] StrDc = new string[Dt.Columns.Count]; string HeadStr = string.Empty; for (int i = 0; i < Dt.Columns.Count; i++) { StrDc[i] = Dt.Columns[i].Caption; HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "?" + "\","; } HeadStr = HeadStr.Substring(0, HeadStr.Length - 1); StringBuilder Sb = new StringBuilder(); Sb.Append("{\"" + Dt.TableName + "\" : ["); for (int i = 0; i < Dt.Rows.Count; i++) { string TempStr = HeadStr; Sb.Append("{"); for (int j = 0; j < Dt.Columns.Count; j++) { TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "?", Dt.Rows[i][j].ToString()); } Sb.Append(TempStr + "},"); } Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1)); Sb.Append("]}"); return Sb.ToString();}
方法二:.NET 3.5及以上版本:
public static string GetJSONString(DataTable dt){ List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); foreach (DataRow dr in dt.Rows) { Dictionary<string, object> row = new Dictionary<string, object>(); foreach (DataColumn dc in dt.Columns) { row.Add(dc.ColumnName, dr[dc]); } rows.Add(row); } System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(); return ser.Serialize(rows);}
方法一其實適用于所有的.NET版本,手動生成json字符串。方法二調(diào)用了.NET3.5新加入的JavaScriptSerializer類的Serialize來轉(zhuǎn)換輸出json字符串。因為datatable是.net的數(shù)據(jù)格式,里面除了數(shù)據(jù)之外,還包含有其它很多信息(比如tablename,primarykey,constraints等),所以需要將它轉(zhuǎn)換成dictionary之后,才可以轉(zhuǎn)換。如果DataTable里面含有datetime這樣格式的數(shù)據(jù),那么輸出的json字符串會是"\/Date(刻度數(shù))\/"??潭葦?shù)是一個正的或負(fù)的長值,該值指示從 UTC 1970 年 1 月 1 日午夜開始已經(jīng)過的刻度數(shù)(毫秒)。在Javascript中,可以調(diào)用下面的函數(shù)來解析這個json值:
function ParseJSONDate (value) { var a; if (typeof value === 'string') { a = /\/Date\((\d*)\)\//.exec(value); if (a) { return new Date(+a[1]); } } return value;}
或者
function ParseJSONDate (value){ return new Date(parseInt(value.substr(6)));}
有一點需要注意的是,websevice是會根據(jù)請求,自動將結(jié)果轉(zhuǎn)換成json格式的數(shù)據(jù),所以沒有必要再手動的去序列化json數(shù)據(jù)。
參考地址:
http://weblogs.asp.net/navaidakhtar/converting-data-table-dataset-into-json-string
http://www.telerik.com/forums/consuming-a-net-json-web-service
http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/
http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/
http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/
聯(lián)系客服