对Jquery+JSON+WebService的一点认识

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("调用出错" + error.responseText);

		}
	});

提示:在$.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:'01082658866'}}",

			success: function(json) { alert(json.d) },

			error: function(error) {

				alert("调用出错" + error.responseText);
			}
		});

  结果如下图:

调用过程与简单参数类型类似,就是通过在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 = "01082678866"}
			                       	};
			return persons;
		}
 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("调用出错" + error.responseText);

			}

		});

  如下图:

也就是说对于复杂返回类型,处理方式也是简单类型基本上是一样的。

曾听到有一种观念认为,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 {
                               Address = "beijing", Age = 27, 
                               Name = "zhangshan", Tel = "01082678866"                               
                              };
			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:'01082658866'}}",

			success: function(json) { $(json.d).each(function() { alert(this.Name + "-" + this.Age + "-" + this.Address + "-" + this.Tel) }) },

			error: function(error) {

				alert("调用出错" + error.responseText);

			}

		});

  如下图:

但是测试四中,GetPerson()方法返回Person数据类型。再看看Person实体的定义,根本就没有标记问可序列化。

由结果可知:JQ调用WebService,并不一定需要返回复杂类型的数据必须是可序列化的。

下面做一个有趣的测试。大家都知道WebService的返回类型不能为Hashtable类型。因为它实现了因为它实现 IDictionary接口。

测试五:对于WebService复杂返回类型

         [WebMethod(Description = "测试方法")]
		public Hashtable GetPersonalHashtable()
		{
			Hashtable hashtable = new Hashtable();

			Person person = new Person { Address = "beijing", Age = 25, Name = "zhangshan", Tel = "01082678866" };

			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("调用出错" + error.responseText);

			}

		});

这样,Jq居然能调用成功。这点是有点让人意想不到的。

总结:

1、Jq与WebService之间以JSON作为数据交换形式的时候,contentType: "application/json; charset=utf-8"是必须指定的。

要不然WebService不知道以何种数据作为转换。

2、Jq调用WebService返回复杂数据类型并不一定需要类型为可序列化。

3、WebService返回的JSON数据通过".d"获取如上面测试中的alert(json.d)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码字搬砖

java反射的简单使用

前几天项目中遇到一个相对有意思的事情,那就是一个InsertHbase的工具类接收一个对象,然后获取到对象的每一个属性及其值,最后Insert到Hbase中 ...

762
来自专栏互扯程序

优雅的Java工具库Lombok

最近在公司的项目中看到了对于Lombok的应用,通过@Data注解标注POJO,省略了大量的getter/setter代码,原先冗长的POJO在瘦身之后直接变得...

1092
来自专栏函数式编程语言及工具

Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现。这是因为外界...

1946
来自专栏步履前行

Java Validation Api

在我们应用程序的业务逻辑中,经常会碰到参数教研的情况,比如在Controller中,我们的参数是一个Entity的时候,经常要判断这个Entity的字段是否是...

3195
来自专栏Android知识点总结

SpringBoot-02-之参数传递

2232
来自专栏三好码农的三亩自留地

Java反射—写给自己的总结

上面反射是Oracle官方文档的定义,反射能够突破访问权限控制,这还是很优秀的,但是,问题来了,为什么需要反射或者说什么情况下需要用反射?

1522
来自专栏冰霜之地

iOS如何优雅的处理“回调地狱Callback hell”(二)——使用Swift

在上篇中,我谈到了可以用promise来解决Callback hell的问题,这篇我们换一种方式一样可以解决这个问题。

1722
来自专栏WD学习记录

Python数据结构与算法笔记(1)

ADT(abstract data type)是由用户定义的数据类型,它制定了一组数据值的集合及可作用在这些数据值上的一组操作。ADT的定义与它的具体实现无关,...

2223
来自专栏函数式编程语言及工具

Scalaz(47)- scalaz-stream: 深入了解-Source

   scalaz-stream库的主要设计目标是实现函数式的I/O编程(functional I/O)。这样用户就能使用功能单一的基础I/O函数组合成为功能完...

2805
来自专栏架构之路

JAVA private私有类的 默认构造函数 的生成过程

如果一个类没有定义任何构造函数,则编译器将生成一个缺省的构造函数,该构造函数的访问修改符和类的访问修改符相同,例如: class test将生成test()构造...

3243

扫码关注云+社区