.net泛型在序列化、反序列化JSON数据中的应用

本文介绍如何使用.NET泛型结合Newtonsoft.Json库实现复杂对象的序列化与反序列化,解决Ajax开发中JSON数据组织的问题。

                                     .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】  ,典型的一对多关系。

  1ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
  2    /// MoveInfo 调拨单
  3    /// </summary>

  4    public class MoveInfo
  5ExpandedBlockStart.gifContractedBlock.gif    {
  6ContractedSubBlock.gifExpandedSubBlockStart.gif    属性#region 属性
  7
  8        private int _ID;
  9ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>ID序号</summary>
 10        public int ID
 11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 12ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _ID; }
 13ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _ID = value; }
 14        }

 15
 16        private string _MoveID;
 17ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>MoveID 调拨单编号</summary>
 18        public string MoveID
 19ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 20ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _MoveID; }
 21ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _MoveID = value; }
 22        }

 23
 24        private DateTime _MoveDate;
 25ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>MoveDate 调拨日期</summary>
 26        public DateTime MoveDate
 27ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 28ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _MoveDate; }
 29ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _MoveDate = value; }
 30        }

 31        private int _EX_Unit;
 32ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>EX_Unit 调出单位</summary>
 33        public int EX_Unit
 34ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 35ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _EX_Unit; }
 36ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _EX_Unit = value; }
 37        }

 38
 39
 40        private int _In_Unit;
 41ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>In_Unit 调入单位</summary>
 42        public int In_Unit
 43ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 44ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _In_Unit; }
 45ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _In_Unit = value; }
 46        }
     
 47            
 48        private List<MoveDetailInfo> _Detail;
 49ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 50        /// 调拨设备明细信息
 51        /// </summary>

 52        public List<MoveDetailInfo> Detail
 53ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 54ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _Detail; }
 55ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _Detail = value; }
 56        }

 57        #endregion

 58    }
  
 59    
 60    
 61ExpandedBlockStart.gifContractedBlock.gif     /**//// <summary>
 62    /// 调拨明细信息
 63    /// </summary>

 64    public class MoveDetailInfo
 65ExpandedBlockStart.gifContractedBlock.gif    
 66ContractedSubBlock.gifExpandedSubBlockStart.gif     属性#region 属性   
 67
 68    private int _ID;
 69ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>ID序号</summary>
 70        public int ID
 71ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 72ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _ID; }
 73ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _ID = value; }
 74        }

 75        
 76        private string _M_ID;
 77ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary> M_ID 调拨单ID</summary>
 78        public string M_ID
 79ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 80ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _M_ID; }
 81ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _M_ID = value; }
 82        }

 83
 84        private string _DVID;
 85ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary> DVID 资产编号</summary>
 86        public string DVID
 87ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 88ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _DVID; }
 89ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _DVID = value; }
 90        }

 91
 92        private string _DVName;
 93ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary> DVName 设备名称</summary>
 94        public string DVName
 95ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 96ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _DVName; }
 97ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _DVName = value; }
 98        }

 99
100        private string _DVType;
101ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary> DVType设备型号</summary>
102        public string DVType
103ExpandedSubBlockStart.gifContractedSubBlock.gif        {
104ExpandedSubBlockStart.gifContractedSubBlock.gif            get return _DVType; }
105ExpandedSubBlockStart.gifContractedSubBlock.gif            set { _DVType = value; }
106        }

107        #endregion

108    }

 

1. 服务端序列化   

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

    得到的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.  客户端反序列化
     ExtJS处理: Ext.Ajax.request接收服务端传来的数据后,客户端JS即可使用JSON数据了。 

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;

   

 
【继】
 .Net FrameWork3.0之后就提供了JSON、XML数据的序列化、反序列化支持,同时支持JSON和XML之间的映射。
相见WCF介绍http://msdn.microsoft.com/zh-cn/library/bb412170.aspx 。


转载于:https://www.cnblogs.com/jdmei520/archive/2009/09/19/1569600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值