fastjson自定義序列化,使用Json.Net處理json序列化和反序列化接口或繼承類

 2023-12-06 阅读 27 评论 0

摘要:以前一直沒有怎么關注過Newtonsoft的Json.Net這個第三方的.NET Json框架,主要是我以前在開發項目的時候大多數使用的都是.NET自帶的Json序列化類JavaScriptSerializer,但是最近在項目中需要序列化和反序列化一個實現接口的類,而如果使用JavaScriptSerial

以前一直沒有怎么關注過Newtonsoft的Json.Net這個第三方的.NET Json框架,主要是我以前在開發項目的時候大多數使用的都是.NET自帶的Json序列化類JavaScriptSerializer,但是最近在項目中需要序列化和反序列化一個實現接口的類,而如果使用JavaScriptSerializer的話就會出現問題,我們來看看如下場景。

?

首先我們有一個接口IPeople和一個實現了該接口的類Man

interface IPeople
{string Name { get; set; }int Age { get; set; }
}class Man : IPeople
{public string Name { get; set; }public int Age { get; set; }
}

fastjson自定義序列化?我們使用JavaScriptSerializer直接序列化IPeople接口

IPeople poeple = new Man();
poeple.Age = 25;
poeple.Name = "Scott";JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string textJson = jsSerializer.Serialize(poeple);
poeple = jsSerializer.Deserialize<IPeople>(textJson);

會得到序列化后的json文本textJson如下

{"Name":"Scott","Age":25}

我們可以看到在序列化后的json中沒有任何屬性說明這段json到底是由什么類序列化而來的,緊接著在JavaScriptSerializer執行jsSerializer.Deserialize<IPeople>(textJson)做反序列化的時候就拋出了異常提示IPeople沒有默認無參構造函數,也就是說JavaScriptSerializer不知道應該把textJson中的json反序列化為類Man。

json序列化是什么意思。?

而如果我們使用的是Json.NET的話,就可以完美的實現接口IPeople的序列化和反序列化,我們來看看怎么使用Json.NET的序列化和反序列化

IPeople poeple = new Man();
poeple.Age = 25;
poeple.Name = "Scott";JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.TypeNameHandling = TypeNameHandling.All;//這一行就是設置Json.NET能夠序列化接口或繼承類的關鍵,將TypeNameHandling設置為All后,Json.NET會在序列化后的json文本中附加一個屬性說明json到底是從什么類序列化過來的,也可以設置TypeNameHandling為Auto,表示讓Json.NET自動判斷是否需要在序列化后的json中添加類型屬性,如果序列化的對象類型和聲明類型不一樣的話Json.NET就會在json中添加類型屬性,反之就不添加,但是我發現TypeNameHandling.Auto有時候不太好用。。。
string textJson = JsonConvert.SerializeObject(poeple, jsonSerializerSettings);//將JsonSerializerSettings作為參數傳入序列化函數,這樣序列化后的Json就附帶類型屬性
poeple = JsonConvert.DeserializeObject<IPeople>(textJson, jsonSerializerSettings);//將JsonSerializerSettings作為參數傳入反序列化函數,這樣Json.NET就會讀取json文本中的類型屬性,知道應該反序列化成什么類型

這里IPeople接口能被成功序列化和返序列化的關鍵就是jsonSerializerSettings.TypeNameHandling = TypeNameHandling.All這行代碼,我們來看看Json.NET序列化后的json文本信息

{"$type":"Json.Man, Json","Name":"Scott","Age":25}

可以看到Json.NET在序列化后的json文本中添加了一個屬性叫$type來說明json是從Json.Man類序列化而來的,那么后面再反序列化的時候Json.NET就成功地將上面的json文本反序列化成了類Man.

json數據序列化指定字段順序?

所以Json.NET在做json的序列化和反序列化的時候比JavaScriptSerializer更全面,當然在使用JavaScriptSerializer的時候自定義Converter也可以做到序列化接口和繼承類,但是這要麻煩很多。這一點也會讓我以后更多使用Json.NET來實現json的序列化和反序列化。

轉載于:https://www.cnblogs.com/sky-net/p/5955265.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/192010.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息