在 .NET 3.5 中序列化和反序列化 JSON
在 .NET 3.5 中,提供了一个新的类,用于 JSON 的序列化和反序列化。该类全称为:
System.Runtime.Serialization.Json.DataContractJsonSerializer
真长!要使用这个类,必须引入:
System.Runtime.Serialization
System.ServiceModel.Web
感觉有些高深莫测了,倒是挺符合微软一贯的风格。那就尽量写简单一点吧,首先从类定义开始:
- // 必须使用属性 DataContract
- [System.Runtime.Serialization.DataContract]
- class Person
- {
- // 对于要序列化的成员,须标注属性 DataMember
- [System.Runtime.Serialization.DataMember]
- private int Id { get; set; }
- // 注意:看到 private 了吗?跟 XML 不一样,
- // 即使是 private,仍然能够正常序列化和反序列化
- [System.Runtime.Serialization.DataMember]
- public string Name { get; set; }
- public Person(int id, string name)
- {
- Id = id;
- Name = name;
- }
- }
准备数据:
- Person[] people = {
- new Person(1, "A"),
- new Person(2, "B"),
- new Person(3, "C"),
- new Person(4, "D"),
- new Person(5, "E")
- }
下面开始序列化,使用方法 WriteObject(Stream, Object):
- DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));
- MemoryStream stream = new MemoryStream();
- jsonFormator.WriteObject(stream, people);
- string json = Encoding.UTF8.GetString(stream.ToArray());
- stream.Close();
- Console.WriteLine(json);
挺郁闷的,为什么不提供一个 TextWrite 的流呢?这样就可以基于 StringBuilder 建一个 StringWrite 的流,直接写到 StringBuilder 里,免得这么七折八弯的。
试试另外一个重载 WriteObject(XmlWrite, Object):
- DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));
- StringBuilder json = new StringBuilder();
- System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(json);
- jsonFormator.WriteObject(xw, people);
- xw.Close();
- Console.WriteLine(json.ToString());
果然是一个 XML 文件,真不知道微软是怎么想的,我要序列化为一个 XML,用得着费这么大周折吗?况且,弄一个 XML 文件传到浏览器中,单解析这个 XML 文件让它正常显示在各种不同的浏览器上就是一项不小的工作。其实我想要的是一个简单的方法,如 WriteObject(Object),然后返回一个 JSON 格式的 string。看来只能自己再封装一下了。
下面看反序列化,接着 WriteObject(Stream, Object) 那一段程式继续往下写:
- Stream readStream = new MemoryStream(Encoding.UTF8.GetBytes(json));
- Person[] persons = jsonFormator.ReadObject(readStream) as Person[];
- readStream.Close();
- Console.WriteLine(persons.Length);
反序列化倒还算是方便。呵呵,将就着用吧。