说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

使用DataContractJsonSerializer进行JSON序列化的JSONHelper类

HTML文档下载 WORD文档下载 PDF文档下载
在ASP.NET 2.0的 AJAX Extensions v1.0中有一个JavaScriptSerializer类提供了JSON序列化及反序列化的函数。在.NET 3.5中JavaScriptSerializer 已被标记为"过时"。.NET 3.5中新的JSON序列化对象是DataContractJsonSerliaizer,我们需要了解一些新的东西。

作者:Chris Pietschmann

翻译:好库编程网 好饱

 

在ASP.NET 2.0的 AJAX Extensions v1.0中有一个JavaScriptSerializer类提供了JSON序列化及反序列化的函数。在.NET 3.5中JavaScriptSerializer 已被标记为"过时"。.NET 3.5中新的JSON序列化对象是DataContractJsonSerliaizer,我们需要了解一些新的东西。

 

序列化对象

 

创建一个对象Person,拥有FirstName和LastName属性

 

public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    public string FirstName { get; set; }    public string LastName { get; set; }}

 

 

 

现在,为了能够让我们的对象通过使用DataContractJsonSerializer转化为JSON,我们需要让为它加上Serializable或者是DataContract属性。

 

 

/// Marked with the Serializable Attribute[Serializable]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    public string FirstName { get; set; }    public string LastName { get; set; }}/// Marked with the DataContact Attribute[DataContract]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    [DataMember]    public string FirstName { get; set; }    [DataMember]    public string LastName { get; set; }}

 

 

 

序列化代码:

实现Person序列化的基本代码:

 

Person myPerson = new Person("Chris", "Pietschmann");/// Serialize to JSONSystem.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());MemoryStream ms = new MemoryStream();serializer.WriteObject(ms, myPerson);string json = Encoding.Default.GetString(ms.ToArray());

 

生成的JSON结果:

 

/// Person对象添加了Serializable属性,序列化后的结果如下:{"<FirstName>k__BackingField":"Chris","<LastName>k__BackingField":"Pietschmann"}/// 如果标记了DataContract,每个属性标记为DataMember,结果为:{"FirstName":"Chris","LastName":"Pietschmann"}

 

 

 

正如你可以看到第一个序列化的类用Serializable属性标记并不完全符合我们的预期,但仍然是JSON。这种序列化实际上与ASP.NET AJAX客户端JSON序列化是不兼容的。

 

正如你可以看到第二个标有DataContract属性序列化的类正是我们所期待的是的,旧的的JavaScriptSerializer对象会产生相同的JSON。此方法是使用JSON序列化DataContractJsonSerializer,你可以将该结果传递到客户端供ASP.NET AJAX使用。

 

 

反序列化代码

 

基本代码:

 

Person myPerson = new Person();MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());myPerson = serializer.ReadObject(ms) as Person;ms.Close();

 

 

 

控制JSON结果中的属性名称:

使用DataContract和DataMember属性, 你可以在DataMember属性里用"Name"参数指定名称,例子如下:

 

[DataMember(Name = "First")]public string FirstName { get; set; }

 

结果:

 

{"First":"Chris","LastName":"Pietschmann"}

 

下面的JSONHelper使用泛型,能使你的工作轻松些:

 

using System.Runtime.Serialization;using System.Runtime.Serialization.Json;public class JSONHelper{    public static string Serialize<T>(T obj)    {        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());        MemoryStream ms = new MemoryStream();        serializer.WriteObject(ms, obj);        string retVal = Encoding.Default.GetString(ms.ToArray());        ms.Dispose();        return retVal;    }    public static T Deserialize<T>(string json)    {        T obj = Activator.CreateInstance<T>();        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());        obj = (T)serializer.ReadObject(ms);        ms.Close();        ms.Dispose();        return obj;    }}/// Our Person object to Serialize/Deserialize to JSON[DataContract]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    [DataMember]    public string FirstName { get; set; }    [DataMember]    public string LastName { get; set; }}/// Sample code using the above helper methods/// to serialize and deserialize the Person objectPerson myPerson = new Person("Chris", "Pietschmann");// Serializestring json = JSONHelper.Serialize<Person>(myPerson);// DeserializemyPerson = JSONHelper.Deserialize<Person>(json);

 

我的应用程序需要什么样的程序集引用?

 

包含命名空间DataContractJsonSerializer,你可能会说,你需要添加System.Runtime.Serialization的引用。但是,你还需要添加System.ServiceModel.Web的引用。

 

 

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘