/// <summary>
/// 将对象序列化成Json格式字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonStr = System.Text.Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
string p = @"\\Data\((\d+)\+\d|\)\\/";
MatchEvaluator mc = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
return reg.Replace(jsonStr, mc);
}
/// <summary>
/// 日期格式转换
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public static string ConvertJsonDateToDateString(Match m)
{
string ss = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[0].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
return string.Format("\\/Date({0}+0800)\\/",ts.TotalMilliseconds);
}
下面以一个例子为例:
[WebMethod]
public string HelloWorld(string ss)
{
string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["conStr"].ToString();
SqlConnection conn = new SqlConnection(conStr);
SqlDataAdapter da = new SqlDataAdapter("select * from member", conn);//查询Member表
DataTable dt = new DataTable();
da.Fill(dt);
//必须设置TableName,此设置为Member表名,可随意
dt.TableName = "Member";
return JsonSerializer<DataTable>(dt);
}
那么在前台网页获取数据时
$(function () {
$.ajax({
type: "POST",
contentType: "application/json",
dataType: "json",
data: "{}",
url: "WebService1.asmx/HelloWorld",
success: function (data) {
var data = $.parseJSON(data.d);//必须要
$("div").html("");
var re = "<table>";
//find("Member")与之前设置的TableName名称一致,MemberId、MemberName为表中字段名
$.each($(data).find("Member"), function (temp, i) {
var ss = $(i).find("MemberId")[0].innerText;
re = re + "<tr><td>" + $(i).find("MemberId")[0].innerText + "</td><td>" + $(i).find("MemberName")[0].innerText + "</td></tr>";
});
re = re + "</table>";
$("div").html(re);
},
error: function (data) { alert(data.responseText); }
});
});
另注:当data参数中包含有单引号时,首先在data中用escape进行编码,然后在读取时用Server.UrlDecode进行解码即可。
此方法主要适用于DataTable的序列化,若是集合或是Model直接取属性即可。