Loading

在 .NET 3.5 中序列化和反序列化 JSON

 
分类: .NET 框架 905人阅读 评论(0) 收藏 举报

 在 .NET 3.5 中,提供了一个新的类,用于 JSON 的序列化和反序列化。该类全称为:

System.Runtime.Serialization.Json.DataContractJsonSerializer

真长!要使用这个类,必须引入:

System.Runtime.Serialization

System.ServiceModel.Web

感觉有些高深莫测了,倒是挺符合微软一贯的风格。那就尽量写简单一点吧,首先从类定义开始:

 

[c-sharp] view plaincopy
  1. // 必须使用属性 DataContract  
  2. [System.Runtime.Serialization.DataContract]  
  3. class Person  
  4. {  
  5.     // 对于要序列化的成员,须标注属性 DataMember     
  6.     [System.Runtime.Serialization.DataMember]  
  7.     private int Id { getset; }   
  8.     // 注意:看到 private 了吗?跟 XML 不一样,  
  9.     // 即使是 private,仍然能够正常序列化和反序列化   
  10.     [System.Runtime.Serialization.DataMember]  
  11.     public string Name { getset; }  
  12.     public Person(int id, string name)  
  13.     {  
  14.         Id = id;  
  15.         Name = name;  
  16.     }  
  17. }  

 

 

准备数据:

 

[c-sharp] view plaincopy
  1. Person[] people = {  
  2.     new Person(1, "A"),  
  3.     new Person(2, "B"),  
  4.     new Person(3, "C"),  
  5.     new Person(4, "D"),  
  6.     new Person(5, "E")  
  7. }  

 

下面开始序列化,使用方法 WriteObject(Stream, Object):

 

[c-sharp] view plaincopy
  1. DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));  
  2. MemoryStream stream = new MemoryStream();  
  3. jsonFormator.WriteObject(stream, people);  
  4. string json = Encoding.UTF8.GetString(stream.ToArray());  
  5. stream.Close();  
  6. Console.WriteLine(json);  

 

 

挺郁闷的,为什么不提供一个 TextWrite 的流呢?这样就可以基于 StringBuilder 建一个 StringWrite 的流,直接写到 StringBuilder 里,免得这么七折八弯的。

试试另外一个重载 WriteObject(XmlWrite, Object):

 

[c-sharp] view plaincopy
  1. DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));  
  2. StringBuilder json = new StringBuilder();  
  3. System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(json);  
  4. jsonFormator.WriteObject(xw, people);  
  5. xw.Close();  
  6. Console.WriteLine(json.ToString());  

 

果然是一个 XML 文件,真不知道微软是怎么想的,我要序列化为一个 XML,用得着费这么大周折吗?况且,弄一个 XML 文件传到浏览器中,单解析这个 XML 文件让它正常显示在各种不同的浏览器上就是一项不小的工作。其实我想要的是一个简单的方法,如 WriteObject(Object),然后返回一个 JSON 格式的 string。看来只能自己再封装一下了。

下面看反序列化,接着 WriteObject(Stream, Object) 那一段程式继续往下写:

 

[c-sharp] view plaincopy
  1. Stream readStream = new MemoryStream(Encoding.UTF8.GetBytes(json));  
  2. Person[] persons = jsonFormator.ReadObject(readStream) as Person[];  
  3. readStream.Close();  
  4. Console.WriteLine(persons.Length);  

 

 

反序列化倒还算是方便。呵呵,将就着用吧。

 

posted @ 2012-04-20 16:21  青岛欧姆网络科技  阅读(434)  评论(0编辑  收藏  举报