JSON+WebMethod代码总结
时间:2011-03-15 来源:元某人
首先我承认,WebService技术早就不是新鲜玩意了,下面只是对整个过程的代码总结。
前台选择jQuery发送ajax请求,代码如下:
1 $.ajax({ type: "post", url: "Service.asmx/HelloWorld",2 contentType: "application/json;charset=utf-8",
3 dataType: "json",
4 success: function (msg) {
5 alert(msg.d);
6 }
7 });
参数中,type必须是post类型,contentType也必须是application/json,否则发回的数据是xml格式,编码不是必须,但是为了保证不出乱码,还是加上utf-8,dataType写是json。
收到的数据保存在msg.d里,d就是msg的一个属性,因此不能用msg.d.属性名的方法引用发回的数据,需要增加一行处理程序:
var data = eval('(' + msg.d + ')');data才是json解码后的内容。
然后是服务端代码,在项目中新建一个Web服务项,默认名称是Service.asmx,这个文件只有一行代码,真正的代码文件是App_Code里的Service.cs(默认名称),在这个文件中可以看到一行被注释的:[System.Web.Script.Services.ScriptService]。这里需要去掉注释,让前台可以通过脚本访问。
Service.cs里已经默认添加了一个HelloWorld函数,并且带上了[WebMethod]标签。
为了测试json通信,这里简单设计一个保存数据的class
1using System.Runtime.Serialization;2
3namespace Tools {
4 [DataContract]
5 public class UserInfo {
6 private string _uid;
7 private string _name;
8 private DateTime _time;
9
10 [DataMember(Order=1)]
11 public string Uid {
12 get { return _uid; }
13 set { _uid = value; }
14 }
15 [DataMember(Order=2)]
16 public string Name {
17 get { return _name; }
18 set { _name = value; }
19 }
20 [DataMember(Order=3)]
21 public DateTime Time {
22 get { return _time; }
23 set { _time = value; }
24 }
25 }
26}
为了让编译器正确解析DataMember标签,需要引用System.Runtime.Serialization,如果添加了using语句,编译器依然报错,那就在项目里添加它的引用。
接下来回到Service.cs中编写json生成代码。
Order参数表明该项出现在Json数据的第几项,从1开始编号。
Userinfo info =new Userinfo();info.Uid="我是ID";
info.Name = "测试";
info.Time=DataTime.Now();
DataContractJsonSerializer dc = new DataContractJsonSerializer(info.GetType());
string result;
using (MemoryStream ms = new MemoryStream())
{
dc.WriteObject(ms, info);
result = Encoding.UTF8.GetString(ms.ToArray());
}
return result;
使用DataContractJsonSerializer需要包含System.Runtime.Serialization.Json引用,使用MemoryStream需要包含System.IO引用,使用Encoding需要包含System.Text引用。
至此,前台已经可以接受json数据,但是info.Time的解析很特别,是类似\\/Date(1300074709000+0800)\\/的字符串,需要进一步解析。
解析的目标是取出1300074709000+0800,代码如下:
tstr = data.Time;left = tstr.indexOf('(');
tstr = tstr.substring(left + 1, tstr.length-2);
var t = new Date(parseInt(tstr));
然后再用标准Date手段处理日期。