.NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现

JSON 序列化和反序列化实例:

由于JSON对象在数据交换中越来越流行,.NET Framewok 3.5也提供了JSON对象序列化和反序列化的类,这就是System.Runtime.Serialization.Json 命名空间下的 DataContractJsonSerializer 类。利用这个类,可以实现JSON对象的序列化和反序列化。

下面演示如何使用 DataContractJsonSerializer 序列化和反序列化 JavaScript Object Notation (JSON) 格式的数据。此序列化引擎将 JSON 数据转换为 .NET Framework 类型的实例,然后重新转换为 JSON 数据。DataContractJsonSerializer 支持的类型与 DataContractSerializer 相同。JSON 数据格式在编写异步 JavaScript 和 XML (AJAX) 样式的 Web 应用程序时特别有用。Windows Communication Foundation (WCF) 对 AJAX 的支持经过了优化,以便通过 ScriptManager 控件与 ASP.NET AJAX 一起使用。

例子代码如下:

新建一个asp.net 的website

说明:此示例需要安装 .NET Framework 3.5 版才能生成和运行。若要打开项目和解决方案文件,需要使用 Visual Studio 2008。

在default.aspx页面,编写HTML 代码如下:

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  runat ="server" >
    
< title ></ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
      
< asp:Button  ID ="Button_1"  Text ="JSON序列化"  runat ="server"  Width ="80"  Height ="24"   onclick ="Button_1_Click"   />
        
< br  />
        
< asp:Label  ID ="JsonString"  runat ="server"  Text ="【你将得到序列化的字符串】" ></ asp:Label >
        
< br  />
        
< br  />
      
< asp:Button  ID ="Button_2"  Text ="JSON反序列化"  runat ="server"  Width ="100"  Height ="24"  onclick ="Button_2_Click"   />
           
< br  />
        
< asp:Label  ID ="Label1"  runat ="server"  Text ="" ></ asp:Label >
    
</ div >
    
</ form >
</ body >
</ html >

 

后置代码如下:

public   partial   class  _Default : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {

    }

    
// 对象的序列化
     protected   void  Button_1_Click( object  sender, EventArgs e)
    {
        Employee emp 
=   new  Employee()
        {
            Name 
=   " Jack Dong " ,
            Address 
=   " 北京海淀区翠宫大厦 "
        };

        
string  strJSON  =  ToJson < Employee > (emp); // Encoding.Unicode.GetString(mstream.ToArray());
        
// Response.Write(strJSON);
        JsonString.Text  =  strJSON;
    }

    
protected   void  Button_2_Click( object  sender, EventArgs e)
    {
        String strJSON 
=   " {\ " Name\ " :\ " Besson Kack\ " ,\ " Address\ " :\ " 上海大学研究生公寓\ " } " ;
        Employee em 
=  Deserialize < Employee > (strJSON);

        Response.Write(
" 反序列化后Employe实体对象的属性值:Name=<font style='font-weight:blod;'> "   +  em.Name  +   " </font> " );
    }

    
private   string  ToJson < T > (T obj)
    {
        DataContractJsonSerializer ds 
=   new  DataContractJsonSerializer( typeof (T));
        MemoryStream ms 
=   new  MemoryStream();
        ds.WriteObject(ms, obj);
        
string  strJSON  =  Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        
return  strJSON;
    }

    
private  T Deserialize < T > ( string  sJson)  where  T :  class
    {
        DataContractJsonSerializer ds 
=   new  DataContractJsonSerializer( typeof (T));
        MemoryStream ms 
=   new  MemoryStream(Encoding.UTF8.GetBytes(sJson));
        T obj 
=  (T)ds.ReadObject(ms);

        ms.Close();
        
return  obj;
    }
}

[DataContract]
public   class  Employee
{
    [DataMember]
    
public   string  Name {  get set ; }

    [DataMember]
    
public   string  Address {  get set ; }
}

 

此示例使用 Employee对象 数据协定演示序列化反序列化

(1)先看反序列化,由JSON 数据反序列化为对象(这里是Employee)。然后重绕流并调用 ReadObject。

        JSON数据{"Address":"北京海淀区卫星大厦 西思艾北京软件","Name":"Jack Dong"}

(2)若要将 Employee类型的实例序列化为 JSON,首先创建 DataContractJsonSerializer 并使用 WriteObject 方法将 JSON 数据编写成流。

        见代码中的泛型方法(ToJson<T>,这里将其抽象成一个通用JSON序列化Function,其实你可以适当做些修改,定义一个接口如IJson,哪怕这个接口内部什么也没有定义,然后基于接口使用扩展方法,定义一个通用序列化类,实现类型JSON序列化和反序列化,同时还可以定义一个深度克隆类型的方法)如下定义:

// 空接口
public   interface  IJson
{
}

public   static   class  JsonHelper
{
    
public   static   string  ToJson( this  IJson source)
    {
        
return  ToJson(source, source.GetType());
    }

    
public   static   string  ToJson( this  IJson source, Type type)
    {
        DataContractJsonSerializer serilializer 
=   new  DataContractJsonSerializer(type);
        
using  (Stream stream  =   new  MemoryStream())
        {
            serilializer.WriteObject(stream, source);
            stream.Flush();
            stream.Position 
=   0 ;
            StreamReader reader 
=   new  StreamReader(stream);
            
return  reader.ReadToEnd();
        }
    }

    
public   static  T ParseJSON < T > ( this   string  str)
    {
        
using  (MemoryStream ms  =   new  MemoryStream(Encoding.Unicode.GetBytes(str)))
        {
            DataContractJsonSerializer serializer 
=   new  DataContractJsonSerializer( typeof (T));
            
return  (T)serializer.ReadObject(ms);
        }
    }

    
//  通过JSON序列化深度克隆类型
     public   static  T DeepClone < T > ( this  IJson Source)  where  T : IJson
    {
        
string  jsonString  =  Source.ToJson();
        
return  jsonString.ParseJSON < T > ();
    }
}

 

在进行代码测试时,注意添加引用System.Runtime.Serialization和System.Runtime.Serialization.Json

“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据。 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定。 数据协定为每个参数或返回类型精确定义为进行交换而序列化(转换为 XML)哪些数据。所有 .NET Framework 基元类型(如整型和字符串型)以及某些被视为基元的类型(如 DateTime 和 XmlElement)无需做其他任何准备工作就可序列化并被视为拥有默认数据协定。 许多 .NET Framework 类型也具有现有数据协定。 必须为所创建的新复杂类型定义数据协定以便可以进行序列化。 正常情况下可通过将 DataContractAttribute 属性应用到该类型来完成该任务。 可以将此属性应用到类、结构和枚举。 然后必须将 DataMemberAttribute 属性应用到数据协定类型的每个成员,以指示这些成员为数据成员,即应进行序列化。

DataMemberAttribute 类:当应用于类型的成员时,指定该成员是数据协定的一部分并可由 DataContractSerializer 进行序列化。

DataContractAttribute 类:指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。若要使其类型可序列化,类型作者必须为其类型定义数据协定。

 

转载于:https://www.cnblogs.com/Dlonghow/archive/2009/02/19/1393702.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值