日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/1/21 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Newtonsoft.Json 的序列化与反序列化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先補(bǔ)充一點(diǎn),Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我舉例說(shuō)明DataTable的序列化和反序列化.
創(chuàng)建一個(gè)DataTable對(duì)象,如下:

DataTable dt = new DataTable();DataColumn dcName = new DataColumn("Name");DataColumn dcAge = new DataColumn("Age");DataColumn dcCity = new DataColumn("City");dt.Columns.Add(dcName);dt.Columns.Add(dcAge);dt.Columns.Add(dcCity);for (int i = 0; i < 10; i++){DataRow dr = dt.NewRow();dr[0] = "Name" + i;dr[1] = "Age" + i;dr[2] = "City" + i;dt.Rows.Add(dr);}

序列化:

string json = JsonConvert.SerializeObject(dt);Console.WriteLine(json);

結(jié)果:

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

DataTable dt1 = JsonConvert.DeserializeObject<DataTable>(json);for (int i = 0; i < dt1.Rows.Count; i++){DataRow dr = dt1.Rows[i];Console.WriteLine("{0}\t{1}\t{2}\t", dr[0], dr[1], dr[2]);}

結(jié)果:

本節(jié)內(nèi)容

1.空值的處理

2.默認(rèn)值的處理

3.忽略某些屬性

4.支持非公共成員

5.日期處理

預(yù)備知識(shí):

要想實(shí)現(xiàn)對(duì)Json.Net序列化和反序列化的控制,就要用到類JsonSerializerSettings,用法很簡(jiǎn)單實(shí)例化一個(gè)對(duì)象,并把它賦值給JsonConvert的參數(shù)即可.

var jSetting = new JsonSerializerSettings();string json = JsonConvert.SerializeObject(obj,jSetting);

開(kāi)始之前,我還是先創(chuàng)建一員工類:

public class Staff{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }public string DepartmentName { get; set; }public Staff Leader { get; set; }} 一.空值的處理

這里的空值指的是引用類型為NULL時(shí),Json.Net如何處理.通過(guò)設(shè)置jSetting.NullValueHandling的值來(lái)確定,該值為枚舉類型.

NullValueHandling.Ignore 忽略為NULL的值
NullValueHandling.Include 默認(rèn)值,包括為NULL的值

?

?

?

?

實(shí)例:

Staff jack = new Staff { Name = "Jack", Age = 31, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };var jSetting = new JsonSerializerSettings();jSetting.NullValueHandling = NullValueHandling.Ignore;string json = JsonConvert.SerializeObject(jack,jSetting);Console.WriteLine(json);

結(jié)果:

2.默認(rèn)值的處理

?一般是對(duì)于值類型的處理,通過(guò)設(shè)置jSetting.DefaultValueHandling的值來(lái)確定,該值為枚舉類型.

DefaultValueHandling.Ignore 序列化和反序列化時(shí),忽略默認(rèn)值
DefaultValueHandling.Include 序列化和反序列化時(shí),包含默認(rèn)值

?

?

?

?

給成員設(shè)置默任值,用到"DefaultValue(value)"特性,當(dāng)然別忘了引入命名空間"System.ComponentModel",假設(shè)員工的年齡默認(rèn)值為30

[DefaultValue(30)]public int Age { get; set; }

序列化時(shí)我想忽略為默認(rèn)值的成員

Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };var jSetting = new JsonSerializerSettings();jSetting.DefaultValueHandling = DefaultValueHandling.Ignore;string json = JsonConvert.SerializeObject(jack,jSetting);Console.WriteLine(json);

結(jié)果:

3.忽略某些屬性

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

OptOut默認(rèn)值,類中所有公有成員會(huì)被序列化,如果不想被序列化,可以用特性JsonIgnore
OptIn默認(rèn)情況下,所有的成員不會(huì)被序列化,類中的成員只有標(biāo)有特性JsonProperty的才會(huì)被序列化,當(dāng)類的成員很多,但客戶端僅僅需要一部分?jǐn)?shù)據(jù)時(shí),很有用

?

?

假如客戶僅僅需要員工的姓名,此時(shí)

[JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]public class Staff{[JsonProperty]public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }public string DepartmentName { get; set; }public Staff Leader { get; set; }}

序列化:

Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = null };string json = JsonConvert.SerializeObject(jack);

結(jié)果:

如果客戶不想要員工的領(lǐng)導(dǎo)信息

public class Staff{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }public string DepartmentName { get; set; }[JsonIgnore]public Staff Leader { get; set; }}

序列化:

Staff tom = new Staff { Name = "Tome", Age = 42, Gender = "Male", DepartmentName = "Personnel Department"}; Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male", DepartmentName = "Personnel Department", Leader = tom }; string json = JsonConvert.SerializeObject(jack); Console.WriteLine(json);

結(jié)果:

4.支持非公共成員

Json.Net序列化對(duì)象時(shí),默認(rèn)情況下僅僅序列化公有成員,如果想要非公有成員也被序列化,就要在該成員上加特性"JsonProperty"

5.日期處理

  JsonConverters會(huì)在序列化和反序列化時(shí)被用到。JsonConverters允許手動(dòng)對(duì)Json的控制。當(dāng)Json的結(jié)構(gòu)很復(fù)雜和你想改變一個(gè)類型怎么樣被序列化時(shí),這是非常有用的。當(dāng)一個(gè)JsonConverters被添加到JsonSerializer時(shí),它會(huì)檢查每一要被序列化和反序列化的值,并返回CanConvert,如果為T(mén)rue,則JsonConverter讀和寫(xiě)這個(gè)值;需要注意的是,雖然JsonConverter能夠使你可以完全的控制Json的值,但是很多的Json.Net序列化的特性被限制,像是類型名稱和引用處理。所有的JsonConvert都在命名空間?"Newtonsoft.Json.Converters"

5.1IsoDateTimeConverter??JavaScriptDateTimeConverter

這是Json.Net中自帶的兩個(gè)處理日期的類,默認(rèn)是IsoDateTimeConverter?,它的格式是"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK".另一個(gè)是JavaScriptTimeConverter,它的格式是 "new Date(ticks)",其實(shí)返回的是一個(gè)JavaScript的Date對(duì)象.
有兩種方式來(lái)應(yīng)用JsonConverter,改變Json序列化和反序列化的行為.

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

假設(shè)我們?yōu)閱T工添加兩個(gè)日期類型的成員,出生日期和入職日期

public class Staff{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }public string DepartmentName { get; set; }public Staff Leader { get; set; }public DateTime BirthDate { get; set; }public DateTime EmploymentDate { get; set; }}

我們的客戶要求日期類型的成員返回javascript的日期對(duì)象


Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };string json = JsonConvert.SerializeObject(jack,new JavaScriptDateTimeConverter());Console.WriteLine(json);

結(jié)果:

?

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

現(xiàn)在我們的客戶要求出生日期以"ISO"標(biāo)準(zhǔn)日期格式返回,入職日期以Javascript的Date對(duì)象格式返回,修改我們的員工類

public class Staff{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }public string DepartmentName { get; set; }public Staff Leader { get; set; }[JsonConverter(typeof(IsoDateTimeConverter))]public DateTime BirthDate { get; set; }[JsonConverter(typeof(JavaScriptDateTimeConverter))]public DateTime EmploymentDate { get; set; }}

是的,通過(guò)特性"JsonConverter"來(lái)實(shí)現(xiàn)差異化的
序列化:

Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };string json = JsonConvert.SerializeObject(jack);Console.WriteLine(json);

結(jié)果:

5.2自定義日期格式

客戶現(xiàn)在提出要求,希望得到的日期格式是符合中國(guó)人習(xí)慣的格式.要求返回的格式是"2012年4月20日".挑戰(zhàn)來(lái)了,沒(méi)有挑戰(zhàn)就沒(méi)有進(jìn)步,我喜歡挑戰(zhàn).光說(shuō)是沒(méi)有用的!先分析一下怎么解決這個(gè)問(wèn)題.我考慮了兩種思路.
  思路一:
研究了一下上面兩個(gè)日期處理類,發(fā)現(xiàn)他們都是繼承了基類"DateTimeConverterBase",所以我們可以參考"IsoDatetimeConverter"的實(shí)現(xiàn)方式,自己新建一個(gè)處理日期格式的轉(zhuǎn)換器類.這種方式的缺點(diǎn)是可能要花大量的時(shí)間去研究,比較費(fèi)時(shí)費(fèi)力.優(yōu)點(diǎn)就是可以對(duì)日期格式隨心所欲的控制.
  思路二:
我又研究了一下"IsoDatetimeConverter",發(fā)現(xiàn)它的日期格式其實(shí)是由于內(nèi)部DefaultDateTimeFormat?=?"yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"導(dǎo)致,而它也提供了修改日期樣式的屬性"DateTimeFormat",只要我們按照這種格式來(lái)寫(xiě)就OK了.

Staff jack = new Staff { Name = "Jack", Age = 30, Gender = "Male",DepartmentName = "Personnel Department", BirthDate = new DateTime(1982,2,12), EmploymentDate = new DateTime(2010,12,12) };IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };string json = JsonConvert.SerializeObject(jack,dtConverter);Console.WriteLine(json);

?結(jié)果:

轉(zhuǎn)載于:https://www.cnblogs.com/08shiyan/p/3464028.html

總結(jié)

以上是生活随笔為你收集整理的Newtonsoft.Json 的序列化与反序列化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。