天天看點

Json.Net系列教程 2.Net類型與JSON的映射關系

首先謝謝大家的支援和關注.本章主要介紹.Net類型與JSON是如何映射的.我們知道JSON中類型基本上有三種:值類型,數組和對象.而.Net中的類型比較多.到底它們是如何映射的呢?

總體來講,Json.Net将.Net中的基本類型(int,float,string等)轉換為Json的值,數組和集合轉換為Json的數組,其它轉換為Json對象.

1.基本類型:

Json.Net系列教程 2.Net類型與JSON的映射關系

2.複雜類型:

Json.Net系列教程 2.Net類型與JSON的映射關系

3.注意

3.1數組和集合

如果你自定義了實作了數組和集合的類,并為類添加了自己的屬性,抱歉在序列化時,該屬性不會被序列化.例如我定義了如下的集合:

執行個體化該類并序列化

Json.Net系列教程 2.Net類型與JSON的映射關系
Json.Net系列教程 2.Net類型與JSON的映射關系

效果:

Json.Net系列教程 2.Net類型與JSON的映射關系

如果我想把數組以對象的形式序列化,可不可以呢?答案是肯定的!

隻要在定義的數組類的前面加上特性"JsonObject"即可,當然先要引入命名空間"Newtonsoft.Json".

結果:

Json.Net系列教程 2.Net類型與JSON的映射關系

 是的,你會發現結果中沒有我們添加的值了,并且多出了很多其他我們并沒有定義的值,這是因為我們添加的值在ArrayList中是以私有數組來存儲的,預設情況下,Json.Net是僅僅序列化公有成員的.多出來的值是繼承的接口中的屬性.

3.2字典類型

字典類型(Dictionary,IDictionary,Hashtable等)會被序列化為對象,是以其中的key/value的形式來序列化,額外添加的屬性不會被序列化.這裡不再詳講了.

3.3Dynamic類型

在.Net4.0中,Dynamic基本上有兩種用法.

一種是作為屬性來用,在這種情況下序列化時會根據實際的類型來序列化.

第二

種用法是繼承了IDynamicMetaObjectProvider 接口或者DynamicObject

基類,例如.Net中内置的類ExpandoObject

,這三者之間的關系是:ExpandoObject,DynamicObject都繼承了IDynamicMetaObjectProvider.這種情

況下,隻有DynamicMetaObject.GetDynamicMemberNames的傳回的成員的屬性會被序列化.

 首先建立一個類,繼承基類 DynamicObject

Json.Net系列教程 2.Net類型與JSON的映射關系
Json.Net系列教程 2.Net類型與JSON的映射關系

在主程式中,做如下操作:

Json.Net系列教程 2.Net類型與JSON的映射關系
Json.Net系列教程 2.Net類型與JSON的映射關系

結果:

Json.Net系列教程 2.Net類型與JSON的映射關系

是的,委托類型也被序列化了,這并不是我們想要的,有沒有方法來将它排除呢?答案就在GetDynamicMemberNames方法,預設我們傳回的是所有的Keys,隻要我們加一定的限制條件即可.修改之後的代碼

Json.Net系列教程 2.Net類型與JSON的映射關系
Json.Net系列教程 2.Net類型與JSON的映射關系

此時的運作結果:

Json.Net系列教程 2.Net類型與JSON的映射關系

 OK!有什麼問題,請及時告訴我啊!一起學習!