C#WebService的简单和复杂参数类型和结果的JSON格式
Jquery作为⼀款优秀的JS框架,简单易⽤的特性就不必说了。在实际的开发过程中,使⽤JQ的AJAX函数调⽤WebService
的接⼝实现AJAX的功能也成了⼀种⽐较普遍的技术⼿段了。WebService接⼝的实现,通常都是由OOP语⾔实现的。所以
在WebService的接⼝函数中,难免可能会遇到除了简单数据类型的复杂数据类型。复杂的数据的数据类型机有可能是
WebService接⼝中的参数,也有可能是WebService的返回值。本⽂所叙述的要点为:
1、对于WebService接⼝复杂类型的参数,JQ调⽤的时候传⼊的JSON数据应该如何表⽰。?
2、JQ对WebService调⽤获取JSON数据类型。
3、JQ调⽤的时对Webservice返回的复杂数据类型有什么样要求。?
环境:JQ版本:1.4.2、VS2008 SP1。
测试⼀:对于WebService简单参数类型:
复制代码代码如下:
WebService接⼝函数代码如下:
[WebMethod(Description = "测试⽅法")] public string ProcessPersonalInfo(Person person) { return person.Name + person.Tel; } JQ调⽤代码如下:
$.ajax({
type: "POST",
url: "WebService1.asmx/GetString",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: "{'name':'zhangsan'}",
success: function(json) { alert(json.d) },
error: function(error) {
alert("调⽤出错" + sponseText);
} });
提⽰:在$.ajax函数中,data必须要以字符串的形式表⽰JSON,⽽不能直接⽤JSON数据传进去。可能有些朋友对JSON对象和JSON对象的字符串
不⼤好区分,其实,字符串类似C#⾥⽤“”引起来的东西,⽽JSON对象是直接写在{}中的。简单的测试⽅法是直接通过alert函数弹出,如果显⽰[object:object]则为JSON对象,否则就是⼀个字符串。
结果如下图:
测试⼆:对于WebService复杂参数类型:
复制代码代码如下:
WebService接⼝函数代码如下:
[WebMethod(Description = "测试⽅法")] public string ProcessPersonalInfo(Person person) {
return person.Name + person.Tel; } Person实体:
public class Person { public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Tel { get; set; }
}
JQ调⽤代码如下:
$.ajax({
type: "POST",
url: "WebService1.asmx/ProcessPersonalInfo",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: "{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'010********'}}",
success: function(json) { alert(json.d) },
error: function(error) {
alert("调⽤出错" + sponseText); } });
结果如下图:
调⽤过程与简单参数类型类似,就是通过在JS中⽤⼀个表⽰Person的person对象的字符串,发往客户端后,WebService会⾃动将person对象的字符串
转换为Person实体对象。
测试三:对于WebService复杂返回类型
复制代码代码如下:
WebService接⼝函数代码如下:
[WebMethod(Description = "测试⽅法")] public List<Person> GetPersonalList() { List<Person> persons = new List<Person>
{ new Person {Address = "beijing", Age = 25, Name = "zhangshan", Tel = "010********"} }; return persons; }<BR> JQ调⽤代码如下:
$.ajax({
type: "POST",
url: "WebService1.asmx/GetPersonalList",
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(json) { $(json.d).each(function() { alert(this.Name + "-" + this.Age + "-" + this.Address + "-" + this.Tel) }) },
error: function(error) {
alert("调⽤出错" + sponseText);
}
});
如下图:
也就是说对于复杂返回类型,处理⽅式也是简单类型基本上是⼀样的。
曾听到有⼀种观念认为,Jq调⽤时WebSevice,⽤JSON作为数据交互格式时,返回数据类型⼀定是可序列化的。真的是这样吗。?
.Net的基本数据类型确实是可序列化的,这⼀点没有疑问。那么List<T>数据类型是否可以序列化呢。?看看List<T>的元数据(Metadata)信息
就知道了。。
[DebuggerTypeProxy(typeof (Mscorlib_CollectionDebugView<T>))]
[DebuggerDisplay("Count = {Count}")]
[Serializable]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
{
/**/
}
如果上⾯的说法成⽴,在这种情况下,调⽤成功也⽆可厚⾮。但是问题真是这样吗。?下⾯继续测试⼀下:
测试四:对于WebService复杂返回类型
复制代码代码如下:
[WebMethod(Description = "测试⽅法")] public Person GetPerson() { Person person = new Person {<BR> Address = "beijing", Age = 27, <BR> Name = "zhangshan", Tel = "010********" <BR> }; return person; }
JQ调⽤代码如下:
$.ajax({
type: "POST",
url: "WebService1.asmx/GetPerson",
dataType: "json",
contentType: "application/json; charset=utf-8",
//data: "{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'010********'}}",
success: function(json) { $(json.d).each(function() { alert(this.Name + "-" + this.Age + "-" + this.Address + "-" + this.Tel) }) },
error: function(error) {
alert("调⽤出错" + sponseText);
}
});
如下图:
但是测试四中,GetPerson()⽅法返回Person数据类型。再看看Person实体的定义,根本就没有标记问可序列化。
由结果可知:JQ调⽤WebService,并不⼀定需要返回复杂类型的数据必须是可序列化的。
下⾯做⼀个有趣的测试。⼤家都知道WebService的返回类型不能为Hashtable类型。因为它实现了因为它实现 IDictionary接⼝。
测试五:对于WebService复杂返回类型
js的基本数据类型复制代码代码如下:
[WebMethod(Description = "测试⽅法")] public Hashtable GetPersonalHashtable() { Hashtable hashtable = new Hashtable();
Person person = new Person { Address = "beijing", Age = 25, Name = "zhangshan", Tel = "010********" };
hashtable.Add(1, person);
return hashtable; }
JQ调⽤代码如下:
$.ajax({
type: "POST",
url: "WebService1.asmx/GetPersonalHashtable",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: data,
success: function(json) { $(json.d).each(function() { alert(this["one"].Name) }) },
error: function(error) {
alert("调⽤出错" + sponseText);
}
});
这样,Jq居然能调⽤成功。这点是有点让⼈意想不到的。
总结:
1、Jq与WebService之间以JSON作为数据交换形式的时候,contentType: "application/json; charset=utf-8"是必须指定的。
要不然WebService不知道以何种数据作为转换。
2、Jq调⽤WebService返回复杂数据类型并不⼀定需要类型为可序列化。
3、WebService返回的JSON数据通过".d"获取如上⾯测试中的alert(json.d)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论