首先謝謝大家的支援和關注.本章主要介紹.Net類型與JSON是如何映射的.我們知道JSON中類型基本上有三種:值類型,數組和對象.而.Net中的類型比較多.到底它們是如何映射的呢?
總體來講,Json.Net将.Net中的基本類型(int,float,string等)轉換為Json的值,數組和集合轉換為Json的數組,其它轉換為Json對象.
1.基本類型:
2.複雜類型:
3.注意
3.1數組和集合
如果你自定義了實作了數組和集合的類,并為類添加了自己的屬性,抱歉在序列化時,該屬性不會被序列化.例如我定義了如下的集合:
執行個體化該類并序列化
效果:
如果我想把數組以對象的形式序列化,可不可以呢?答案是肯定的!
隻要在定義的數組類的前面加上特性"JsonObject"即可,當然先要引入命名空間"Newtonsoft.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
在主程式中,做如下操作:
結果:
是的,委托類型也被序列化了,這并不是我們想要的,有沒有方法來将它排除呢?答案就在GetDynamicMemberNames方法,預設我們傳回的是所有的Keys,隻要我們加一定的限制條件即可.修改之後的代碼
此時的運作結果:
OK!有什麼問題,請及時告訴我啊!一起學習!