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

本文介绍如何在.NET3.5中使用DataContractJsonSerializer进行JSON的序列化和反序列化,包括必要的类定义、数据准备及具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

System.Runtime.Serialization.Json.DataContractJsonSerializer

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

System.Runtime.Serialization

System.ServiceModel.Web

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

 

[c-sharp]  view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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);  

 

 

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

 

Json.NET 描述: json。 网络是一个流行的高性能JSON为。NET框架 灵活的JSON序列化器对之间的转换。净对象JSON linq到JSON用于手动阅读写作JSON 高性能,速度比。净的内置JSON序列化器 写缩进,容易阅读JSON JSONXML之间进行转换 支持: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store 版本: Json.NET has different libaries for the various .NET Framework versions. -Net45: .NET latest (4.5) -Net40: .NET 4.0 -Net35: .NET 3.5 -Net20: .NET 2.0 -WinRT: Windows 8 Store -Portable45: .NET 4.5, Windows Phone 8, Windows 8 Store -Portable40: .NET 4.0, Windows Phone 7, Windows 8 Store, Silverlight 4 Notes: Microsoft stopped support for the Compact Framework in Visual Studio 2010. For a Compact Framework 3.5 build download Json.NET 3.5. For a Silverlight 3.0 build download Json.NET 3.5. Microsoft Visual Studio 2010 重新生成解决方案的一些警告处理 警告 2 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 3 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 4 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 5 预定义类型“System.Action”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 6 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 7 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 8 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 9 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 警告 10 预定义类型“System.Func”是在全局别名的多个程序集中定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll”中的定义 ClassLibrary1 问题原因:检查程序发现,由于项目中引用了Newtonsoft.Json.Net20,从而造成系统的类重名(项目FRAMEWORK的版本4.0)。 Newtonsoft.Json.Net 包括: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store,所有dll文件源码,有需要的同学可以直接下载。 个人网站多多支持:www.mlyuansu.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值