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


     
    分类: .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);  

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

  • 相关阅读:
    dedecms织梦建站总结
    ubuntu安装
    git命令
    关于测试日报
    Appium环境搭建(Windows版)
    jmeter,CSV数据加载、数据库连接、正则
    jmeter,参数、Bean Shell断言
    jmeter安装和组件说明
    造数据
    WEB UI自动化
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2459491.html
Copyright © 2020-2023  润新知