现在的位置: 首页 > 综合 > 正文

JSON+WebMethod代码总结

2012年07月12日 ⁄ 综合 ⁄ 共 1903字 ⁄ 字号 评论关闭

首先我承认,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手段处理日期。

抱歉!评论已关闭.