.net泛型在构建JSON数据中的应用

       在EXTJS使用过程中,起初都会被繁琐的JavaScript弄晕,或许你会抱怨这种开发把你带入了JavaScript海洋、或许你会为之而放弃项目的RIA技术。但是当你仔细研究JS控件的配置、数据绑定后,并会发现在服务端组织好JSON数据才是Ajax开发的重点、控件配置仅仅因为暂时没有可视化工具支持而造成的遗憾。
    即使你放弃了ExtJS开发包,但是希望你不要放弃JSON、不要放弃Ajax、更不要放弃RIA开发。没有JSON时,你的页面传递数据受到限制,因为你不能传递复杂对象。JSON能够组织复杂的数据对象,访问复杂对象的成员和C#一样的方便,也正因为如此,JS控件才会诞生,我就是这么认为js控件因为有JSON的支撑才发展起来的。
    首先分析一下Grid控件数据配置要求如下信息:
 方式一:
 [{"Field1":"","Field2","","Field3":""},
  {"Field1":"","Field2","","Field3":""},
  ... 
  {"Field1":"","Field2","","Field3":""}]
 方式二:
 {totalCount:100, success:true, error:"" data:[{},{},...,{}]}
 其中Fieldi可能不是简单数据结构而是个封装的对象。
    这就需要我们AJAX服务端能够提供这样的JSON格式数据,这样的数据格式与WebService使用的xml格式数据是一致的,但是这里需要我们自己生成,这也就比WebService自动解析要灵活。
    用JSONHelper对DataTable进行序列化: 

   ///   <summary>
        
///  获取待办流程
        
///   </summary>
         public   string  GetFlowWait( int  start,  int  limit,  int  userID)
        {
            
string  DGFolwWaitJSON  =   "" ;
            JSONHelper json 
=   new  JSONHelper();
            
try
            {
                DataSet ds 
=  biz.GetFlowWait(userID);
                json.success 
=   true ;                
                
if  (start  <  ds.Tables[ 0 ].Rows.Count)
                    
for  ( int  i  =  start; i  <  limit + start  &&  i  <  ds.Tables[ 0 ].Rows.Count; i ++ )
                    {
                        DataRow dr 
=  ds.Tables[ 0 ].Rows[i];
                        json.AddItem(
" id " , dr[ " ID " ].ToString());
                        json.AddItem(
" name " , dr[ " Name " ].ToString());
                        json.AddItem(
" creatorname " , dr[ " CreatorName " ].ToString());
                        json.AddItem(
" creatordept " , dr[ " CreatorDept " ].ToString());
                        json.AddItem(
" createdate " , dr[ " CreateDate " ].ToString());
                        json.AddItem(
" formcontent " , dr[ " TemplateName " ].ToString()); // FormContent
                        json.AddItem( " templatename " , dr[ " TemplateName " ].ToString());
                        json.AddItem(
" currentstepid " , dr[ " CurrentStepID " ].ToString());
                        json.ItemOk();
                    }
                json.totlalCount 
=  ds.Tables[ 0 ].Rows.Count;
                DGFolwWaitJSON 
=  json.ToString();
            }
            
catch  (Exception)
            {
                
throw ;
            }
            
return  DGFolwWaitJSON;
        }

 
            这种序列化的方法很麻烦,而且只能对简单数据类型进行序列化。如果对象成员自身也是复杂对象(如List<T>)的话,上述方法就无能为力了。服务器如何组织这样的复杂JSON对象呢?
    Newtonsoft.Json.dll与System.Web.Script.Serialization都有序列化、反序列化JSON数据的功能。
    原型如下:

 System.Web.Script.Serialization.JavaScriptSerializer js  =   new  JavaScriptSerializer();
     
string  strJSON =  js.Serialize( object );
     T t
= js.Deserialize < T > ( string );

      
string  strJSON =  Newtonsoft.Json.JavaScriptConvert.SerializeObject( object );
      T t
=  Newtonsoft.Json.JavaScriptConvert.DeserializeObject < T > ( string );

              
    此时不难想到.net的泛型,使用泛型抽象一个类,只需要对泛型实例化的实体进行序列化,即可达到上述复杂结构的JSON了。
    首先需要定一个泛型类:

    public   class  JSONObject < T >
    {
        
private   bool  _success;
        
///   <summary>
        
///  是否成功
        
///   </summary>
         public   bool  success
        {
            
get  {  return  _success; }
            
set  { _success  =  value; }
        }

        
private  T _Object;
        
///   <summary>
        
///  业务实体对象
        
///   </summary>
         public  T Object
        {
            
get  {  return  _Object; }
            
set  { _Object  =  value; }
        }

        
private   string  _msg;
        
///   <summary>
        
///  消息
        
///   </summary>
         public   string  msg
        {
            
get  {  return  _msg; }
            
set  { _msg  =  value; }
        }

    }

    接下来,业务实体类定义:
 【调拨单MoveInfo -》调拨设备明细MoveDetailInfo】  ,典型的一对多关系。

  1      /// <summary>
  2    /// MoveInfo 调拨单
  3    /// </summary>

  4      public   class  MoveInfo
  5      {
  6    属性
 58    }
  
 59     
 60     
 61       /// <summary>
 62    /// 调拨明细信息
 63    /// </summary>

 64      public   class  MoveDetailInfo
 65     
 66     属性
108    }

 

1. 服务端序列化   

JSONObject < MoveInfo >  obj  =   new  JSONObject < MoveInfo > ();
                obj.msg 
=   " 成功 " ;
                obj.success 
=   true ;
                obj.Object 
=  info;
               
string  strJSON  =   Newtonsoft.Json.JavaScriptConvert.SerializeObject(obj);  

    得到的JSON如下:

     ExtJS处理: Ext.Ajax.request接收服务端传来的数据后,客户端JS即可使用JSON数据了。 

 {"success":true,"Object":{"ID":-1,"MoveID":"D09-242","MoveDate":new Date(1253351980781),"EX_Unit":0,"In_Unit":0,"Remark":null,"Detail":[{"ID":0,"M_ID":null,"DVID":"0","DVName":"aa0","DVType":null},{"ID":0,"M_ID":null,"DVID":"1","DVName":"aa1","DVType":null},{"ID":0,"M_ID":null,"DVID":"2","DVName":"aa2","DVType":null}]},"msg":"成功"}


2.  客户端反序列化

var  data  =  Ext.util.JSON.decode(response.responseText); // 使用eval()也可以
       if (data.success)
        
var  movebill  =  data.Object;
        
var  listdetail = movebill.Detail;
      
else  
        alert(data.msg);

      
3.服务端反序列化

 JSONObject < MoveInfo >  obj = Newtonsoft.Json.JavaScriptConvert.DeserializeObject < JSONObject <MoveInfo > >(strJSON);
        string msg=obj.msg;
    string success=obj.success;
    MoveInfo info=obj.Object;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值