jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据

作者:清欢时间:2026-10-25 20:23:13浏览:211

本文详细讲解如何使用jQuery Ajax向ASP.NET Webservice提交JSON数据。涵盖GET与POST两种方式的参数传递差异,重点演示如何处理包含嵌套结构的复杂JSON数据,并通过.NET 3.5自带的DataContractJsonSerializer实现服务端反序列化,确保前后端数据交互的准确性与安全性。

jQuery Ajax调用Webservice概述

jQuery ajax调用Webservice:get和post方法


一、GET 方式

GET方式提交简单JSON数据

客户端示例


代码如下:

 
var data = { classCode: "0001"}; // 此处需直接使用JSON对象
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "/WebServices/ProductPropertyWebService.asmx/GetProductPropertyList",
dataType: "json",
anysc: false,
data: data,
success: RenderProperties,
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown + ':' + textStatus); // 错误处理逻辑
} 
}); 

服务器端

服务端代码


代码如下:

 
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] // 设置UseHttpGet = true
public List<Property> GetProductPropertyList()
{ 
string classCode = HttpContext.Current.Request["classCode"]; // GET方式需在查询字符串中获取参数值
return PropertyManager.GetPropertySet(classCode, "zh-CN").DataList;
} 

二、POST 方式

POST方式提交JSON数据

客户端示例


代码


代码如下:

 
var data = '{ classCode: "' + classCode + '", city: "GuangDong" }'; // 此处需使用拼接好的JSON字符串
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/WebServices/ProductPropertyWebService.asmx/GetProductPropertyList",
dataType: "json",
anysc: false,
data: data, // POST方式,data参数不能为空,若不传参数需写成"{}",否则contentType无法附加至Request Headers。
success: RenderProperties,
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown + ':' + textStatus); // 错误处理逻辑
} 
}); 

服务器端

服务端代码


代码如下:

 
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = false)] // 设置UseHttpGet = false
public List<Property> GetProductPropertyList(string classCode, string city) // POST方式,参数对应JSON字段属性并自动赋值
{ 
return PropertyManager.GetPropertySet(classCode, "zh-CN").DataList;
} 

GET方式中文参数编码注意事项

注意:GET方法与POST方法不同,有参数时,若参数值非ASCII字符(如中文),GET参数需进行encodeURI编码,否则服务端接收数据将乱码。


复杂的Json数据提交

复杂嵌套JSON数据的提交与反序列化

简单的Json格式数据示例:{ name:Yangjun, age:27 }


复杂的Json格式数据,实为Json嵌套,例如:{name:yangjun, age:27, child:[{name:yangke, age:1},{name:yangbin, age:2}]}


若需提交此类复杂Json格式数据并在Webservices中获取,随后根据Json字符串序列化为.net对象,应如何处理?


例如提交以下数据:


客户端:

代码


代码如下:

 
var productPropertyTemplate = {"ProductId":10024, "PropertyList":[
{"PropertyId":18, "PropertyType":"text", "PropertyValue":"号码是100"},
{"PropertyId":19, "PropertyType":"checkbox", "PropertyValue":"57|28"}]}
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "/WebServices/ProductPropertyWebService.asmx/PostProductPropertyList",
anysc: false,
data: { propertyList: productPropertyTemplate },
dataType: "json",
success: function (result) { alert(result.d) },
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown + ':' + textStatus);
} 
}); 

服务器端:

1、反序列化Json字符为.net对象有多种开源类库,本文使用.net 3.5版本以上自带的DataContractJsonSerializer,编写辅助类:


代码


代码如下:

 
/// <summary>
/// Json序列化和反序列化的帮助方法
/// </summary>
public class JsonHelper
{ 
/// <summary>
/// JSON序列化:将对象序列化为Json格式字符串
/// </summary>
public static string JsonSerializer<T>(T t)
{ 
var ser = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
} 
/// <summary>
/// JSON反序列化:根据Json格式字符串反序列化为对象
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{ 
var ser = new DataContractJsonSerializer(typeof(T));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
var obj = (T)ser.ReadObject(ms);
return obj;
} 
} 

2、因需反序列化为相应对象,故先构造两个对象类,注意每个类及字段前的特性修改符:


代码


代码如下:

 
[DataContract]
public class MProductProperty
{ 
[DataMember(Order = 0, IsRequired = true)]
public int ProductId { set; get; }
[DataMember(Order = 1, IsRequired = true)]
public List<MProperty> PropertyList { set; get; }
} 
public class MProperty
{ 
[DataMember(Order = 0, IsRequired = true)]
public int PropertyId { set; get; }
[DataMember(Order = 1, IsRequired = true)]
public string PropertyType { set; get; }
[DataMember(Order = 2, IsRequired = true)]
public string PropertyValue { set; get; }
} 

3、接收并处理Json数据的Web方法:


代码


代码如下:

 
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string PostProductPropertyList()
{ 
string jsonString = HttpContext.Current.Request["propertyList"];
var productProperty = JsonHelper.JsonDeserialize<MProductProperty>(jsonString); // productProperty 成功反序列化为MProductProperty对象
// 返回接收成功标识
return "postsuccess";
} 
作者最新文章