天天看點

Newtonsoft.Json 序列化和反序列化 以及時間格式

1.JSON序列化

string JsonStr= JsonConvert.SerializeObject(Entity);

eg:

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

2.JSON反序列化

string jsonstr = "jsonString";

Class model = JsonConvert.DeserializeObject<Class>(jsonstr);

 3.時間格式處理

 4.擴充方法

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

5.日期處理

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

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

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

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

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

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

結果:

Newtonsoft.Json 序列化和反序列化 以及時間格式

3.忽略某些屬性

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

OptOut

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

OptIn

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

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

序列化:

Newtonsoft.Json 序列化和反序列化 以及時間格式

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

4.支援非公共成員

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

  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 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

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

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

5.2自定義日期格式

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

  思路一:

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

  思路二:

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

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

 結果:

Newtonsoft.Json 序列化和反序列化 以及時間格式

6.FAQ

1.如何自定義序列化的字段名稱?

預設情況下,Json.Net序列化後結果中的字段名稱和類中屬性的名稱一緻.如果想自定義序列化後的字段名稱,可以使用JsonProperty.例如:

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

預設序列化的結果為: {"Id":1,"Name":"楊過"},如果不想用預設的字段名稱,可以使用如下方式:

Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式
Newtonsoft.Json 序列化和反序列化 以及時間格式

這樣序列化的結果為:{"PersonId":1,"PersonName":"楊過"}

 原文連結:https://www.cnblogs.com/litian/p/3870975.html

龍騰一族至尊龍騎

繼續閱讀