在C#中使用Json.Net進(jìn)行序列化和反序列化及定制化

序列化(Serialize)是將對(duì)象轉(zhuǎn)換成字節(jié)流,并將其用于存儲(chǔ)或傳輸?shù)倪^程,主要用途是保存對(duì)象的狀態(tài),以便在需要時(shí)重新創(chuàng)建該對(duì)象唐片;反序列化(Deserialize)則是將上面的字節(jié)流轉(zhuǎn)換為相應(yīng)對(duì)象的過程;在.Net陣營(yíng)中涨颜,Json.Net是由官方推薦的高性能開源序列化/反序列化工具费韭,其官方網(wǎng)站:?https://www.newtonsoft.com/json?;

一庭瑰、將對(duì)象序列化為Json格式字符串

首先是正常的序列化操作星持,對(duì)于給定的類:

privateclassMyClass{publicintMyNum;publicstringMyStr;}

將該類的實(shí)例序列化為Json格式字符串,首先引用命名空間Newtonsoft.Json:

MyClass myClass =newMyClass { MyNum =10, MyStr ="Hello World"};Console.WriteLine(JsonConvert.SerializeObject(myClass));

其打印結(jié)果:

{"MyNum":10,"MyStr":"Hello World"}

在打印到本地Log文件以供自己查看使用時(shí)弹灭,可以選擇轉(zhuǎn)換為帶有縮進(jìn)的Json格式字符串:

Console.WriteLine(JsonConvert.SerializeObject(myClass,Formatting.Indented));

此時(shí)打印結(jié)果為:

{"MyNum":10,"MyStr":"Hello World"}

二督暂、將Json格式字符串反序列化為對(duì)象

對(duì)于給定的字符串:

stringjsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";

將其反序列化為MyClass類型的對(duì)象:

MyClass myClass = JsonConvert.DeserializeObject(jsonStr);Console.WriteLine(myClass.MyStr);//Hello World

三、使用JObject動(dòng)態(tài)序列化/反序列化

以上例子都是使用強(qiáng)類型進(jìn)行序列化和反序列操作穷吮,但有時(shí)也會(huì)用到不指定類型而直接操作Json格式數(shù)據(jù)的情況逻翁,此時(shí)就需要用位于命名空間ewtonsoft.Json.Linq中的JObject類型的對(duì)象:

string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";JObject jObject = JObject.Parse(jsonStr);Console.WriteLine(jObject.ToString(Formatting.None));//{"MyNum":10,"MyStr":"Hello World"}//打印一條屬性的值Console.WriteLine(jObject["MyStr"].Value());//Hello World//添加一條屬性jObject.Add("MyStr2","HaHa");//打印當(dāng)前Json字符串Console.WriteLine(jObject.ToString(Formatting.None));//{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}

四、定制化序列化/反序列過程

1.在C#中捡鱼,定制化的配置通常使用特性來完成八回,這里也不例外,例如簡(jiǎn)單的,在序列化/反序列時(shí)忽略某個(gè)字段/屬性:

privateclassMyClass{? ? [JsonIgnore]publicintMyNum;publicstringMyStr;}

此時(shí)辽社,無論序列化還是反序化時(shí)伟墙,字段MyNum都不再參與這些過程翘鸭;

2.自定義某個(gè)字段/屬性的序列化/反序列化規(guī)則:

當(dāng)接收到的Json格式字符串與本地已有類型不統(tǒng)一時(shí)滴铅,需要進(jìn)行自定義的反序列化過程,反之亦然就乓,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義汉匙,這個(gè)過程依然走的通,只是以此舉例)生蚁,以字符串"FALSE"表示布爾類型false時(shí)噩翠,需要自定義如下:

///<summary>///自定義布爾類型數(shù)據(jù)轉(zhuǎn)換規(guī)則///</summary>publicclassMyBoolConverter:JsonConverter{privateconststringTrueStr ="TRUE";privateconststringFalseStr ="FALSE";publicoverrideboolCanConvert(Type objectType)=>true;//反序列化publicoverrideobjectReadJson(JsonReader reader, Type objectType,objectexistingValue, JsonSerializer serializer){if(reader.ValueType ==typeof(string))? ? ? ? {if((string)reader.Value == TrueStr)? ? ? ? ? ? {returntrue;? ? ? ? ? ? }else{returnfalse;? ? ? ? ? ? }? ? ? ? }returnfalse;? ? }//序列化publicoverridevoidWriteJson(JsonWriter writer,objectvalue, JsonSerializer serializer){if(value.GetType() ==typeof(bool))? ? ? ? {boolresult = (bool)value;if(result)? ? ? ? ? ? {? ? ? ? ? ? ? ? writer.WriteValue(TrueStr);? ? ? ? ? ? }else{? ? ? ? ? ? ? ? writer.WriteValue(FalseStr);? ? ? ? ? ? }? ? ? ? }? ? }}

然后,在需要操作的類型定義中的字段/屬性中加入該特性:

privateclassMyClass{? ? [JsonConverter(typeof(MyBoolConverter))]publicboolMyBool;}

此時(shí):

string jsonStr = @"{""MyBool"": ""TRUE""}";MyClass1 myClass = JsonConvert.DeserializeObject(jsonStr);Console.WriteLine(myClass.MyBool);//TrueConsole.WriteLine(JsonConvert.SerializeObject(myClass));//{"MyBool":"TRUE"}

看我主頁簡(jiǎn)介免費(fèi)C++學(xué)習(xí)資源邦投,視頻教程伤锚、職業(yè)規(guī)劃、面試詳解志衣、學(xué)習(xí)路線屯援、開發(fā)工具

每晚8點(diǎn)直播講解C++編程技術(shù)。非常感謝大家的關(guān)注

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末念脯,一起剝皮案震驚了整個(gè)濱河市狞洋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绿店,老刑警劉巖吉懊,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異假勿,居然都是意外死亡借嗽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門转培,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恶导,“玉大人,你說我怎么就攤上這事堡距〖孜” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵羽戒,是天一觀的道長(zhǎng)缤沦。 經(jīng)常有香客問我,道長(zhǎng)易稠,這世上最難降的妖魔是什么缸废? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上企量,老公的妹妹穿的比我還像新娘测萎。我一直安慰自己,他們只是感情好届巩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布硅瞧。 她就那樣靜靜地躺著,像睡著了一般恕汇。 火紅的嫁衣襯著肌膚如雪腕唧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天瘾英,我揣著相機(jī)與錄音枣接,去河邊找鬼。 笑死缺谴,一個(gè)胖子當(dāng)著我的面吹牛但惶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湿蛔,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膀曾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了煌集?” 一聲冷哼從身側(cè)響起妓肢,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苫纤,沒想到半個(gè)月后碉钠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卷拘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年喊废,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栗弟。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡污筷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乍赫,到底是詐尸還是另有隱情瓣蛀,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布雷厂,位于F島的核電站惋增,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏改鲫。R本人自食惡果不足惜诈皿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一林束、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稽亏,春花似錦壶冒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怎披,卻和暖如春胸嘁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凉逛。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留群井,地道東北人状飞。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像书斜,于是被迫代替她去往敵國(guó)和親诬辈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容