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

简单的Json数据提交 

jQuery ajax  webservice:get 和 post

一、GET 方式
客户端
ExpandedBlockStart.gif 代码
             var  data  =  { classCode:  " 0001 " };  //  这里要直接使用JOSN对象
            $.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);   //  错误处理
                }
            }); 

 

服务器端
ExpandedBlockStart.gif 代码
     [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 方式
客户端
ExpandedBlockStart.gif 代码
             var  data  =   ' { classCode: " '   +  classCode  +   ' ", city: "GuangDong" } ' ;     //  这里要使用拼接好的JOSN字符串
            $.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);  //  错误处理
                }
            });

 

服务器端
ExpandedBlockStart.gif 代码
     [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方法与POST方法不同,有参数的时候,如果参数的值不是ASCII字符(比如中文),GET的参数要encodeURI编码,要不服务端接收到的数据为乱码。

 

 复杂的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对象,应该怎么做呢? 
比如我要提交下面的数据:
客户端:

 

ExpandedBlockStart.gif 代码
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,写一个辅助类:

ExpandedBlockStart.gif 代码
     ///   <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、因为要反序列化成相应的对象,所以先构造两个对象类,注意每个类和类的字段前面的特性修改符:

ExpandedBlockStart.gif 代码
    [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方法:

ExpandedBlockStart.gif 代码
        [WebMethod]
        [ScriptMethod(UseHttpGet 
=   true )]
        
public   string  PostProductPropertyList()
        {
            
string  jsonString  =  HttpContext.Current.Request[ " propertyList " ];
            var productProperty 
=  JsonHelper.JsonDeserialize < MProductProperty > (jsonString);  //  productProperty 成功反序列化成MProductProperty的对象
            
// 返回接收成功标识
             return   " postsuccess " ;
        }

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/yangjunwl/archive/2011/02/17/1957256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值