天天看點

Newtonsoft.Json 的序列化與反序列化

首先補充一點,Json.Net是支援序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我舉例說明DataTable的序列化和反序列化.

建立一個DataTable對象,如下:

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

序列化:

結果:

利用上面得到的序列化字元串反序列化:

Newtonsoft.Json 的序列化與反序列化

本節内容

​​1.空值的處理​​

​​2.預設值的處理​​

​​3.忽略某些屬性​​

​​4.支援非公共成員​​

​​5.日期處理​​

預備知識:

要想實作對Json.Net序列化和反序列化的控制,就要用到類JsonSerializerSettings,用法很簡單執行個體化一個對象,并把它指派給JsonConvert的參數即可.

開始之前,我還是先建立一員工類:

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

一.空值的處理

這裡的空值指的是引用類型為NULL時,Json.Net如何處理.通過設定jSetting.NullValueHandling的值來确定,該值為枚舉類型.

<col>

忽略為NULL的值

預設值,包括為NULL的值

執行個體:

Newtonsoft.Json 的序列化與反序列化

2.預設值的處理

 一般是對于值類型的處理,通過設定jSetting.DefaultValueHandling的值來确定,該值為枚舉類型.

序列化和反序列化時,忽略預設值

序列化和反序列化時,包含預設值

給成員設定默任值,用到"DefaultValue(value)"特性,當然别忘了引入命名空間"System.ComponentModel",假設員工的年齡預設值為30

序列化時我想忽略為預設值的成員

Newtonsoft.Json 的序列化與反序列化

3.忽略某些屬性

首先介紹Json.Net序列化的模式:OptOut 和 OptIn.

OptOut

預設值,類中所有公有成員會被序列化,如果不想被序列化,可以用特性JsonIgnore

OptIn

預設情況下,所有的成員不會被序列化,類中的成員隻有标有特性JsonProperty的才會被序列化,當類的成員很多,但用戶端僅僅需要一部分資料時,很有用

假如客戶僅僅需要員工的姓名,此時

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

如果客戶不想要員工的上司資訊

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

4.支援非公共成員

Json.Net序列化對象時,預設情況下僅僅序列化公有成員,如果想要非公有成員也被序列化,就要在該成員上加特性"JsonProperty"

5.日期處理

  JsonConverters會在序列化和反序列化時被用到。JsonConverters允許手動對Json的控制。當Json的結構很複雜和你想改變一個類型怎麼樣被序列化時,這是非常有用的。當一個JsonConverters被添加到JsonSerializer時,它會檢查每一要被序列化和反序列化的值,并傳回CanConvert,如果為True,則JsonConverter讀和寫這個值;需要注意的是,雖然JsonConverter能夠使你可以完全的控制Json的值,但是很多的Json.Net序列化的特性被限制,像是類型名稱和引用處理。所有的JsonConvert都在命名空間 "Newtonsoft.Json.Converters"下

5.1IsoDateTimeConverter 和 JavaScriptDateTimeConverter

這是Json.Net中自帶的兩個處理日期的類,預設是IsoDateTimeConverter ,它的格式是"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK".另一個是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其實傳回的是一個JavaScript的Date對象.

有兩種方式來應用JsonConverter,改變Json序列化和反序列化的行為.

5.1.1如果你要序列化的日期格式是統一的,可以考慮如下方式

假設我們為員工添加兩個日期類型的成員,出生日期和入職日期

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

我們的客戶要求日期類型的成員傳回javascript的日期對象

Newtonsoft.Json 的序列化與反序列化

5.1.2如果想要不同的日期類型成員序列化後,以不同的形式顯示.

現在我們的客戶要求出生日期以"ISO"标準日期格式傳回,入職日期以Javascript的Date對象格式傳回,修改我們的員工類

Newtonsoft.Json 的序列化與反序列化
Newtonsoft.Json 的序列化與反序列化

是的,通過特性"JsonConverter"來實作差異化的

Newtonsoft.Json 的序列化與反序列化

5.2自定義日期格式

客戶現在提出要求,希望得到的日期格式是符合中國人習慣的格式.要求傳回的格式是"2012年4月20日".挑戰來了,沒有挑戰就沒有進步,我喜歡挑戰.光說是沒有用的!先分析一下怎麼解決這個問題.我考慮了兩種思路.

  思路一:

研究了一下上面兩個日期處理類,發現他們都是繼承了基類"DateTimeConverterBase",是以我們可以參考"IsoDatetimeConverter"的實作方式,自己建立一個處理日期格式的轉換器類.這種方式的缺點是可能要花大量的時間去研究,比較費時費力.優點就是可以對日期格式随心所欲的控制.

  思路二:

我又研究了一下"IsoDatetimeConverter",發現它的日期格式其實是由于内部DefaultDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"導緻,而它也提供了修改日期樣式的屬性"DateTimeFormat",隻要我們按照這種格式來寫就OK了.

 結果:

Newtonsoft.Json 的序列化與反序列化

龍騰一族至尊龍騎