c# Newtonsoft 六個(gè)值得使用的特性(上)
一:講故事
看完官方文檔,閱讀了一些 Newtonsoft
源碼,對(duì)它有了新的認(rèn)識(shí),先總結(jié) 六個(gè)超經(jīng)典又實(shí)用的特性,同大家一起分享,廢話不多說(shuō),快來(lái)一起看看吧~~~
二:特性分析
1. 代碼格式化
如果你直接使用 JsonConvert.SerializeObject
的話,默認(rèn)情況下所有的json是擠壓在一塊的,特別不方便閱讀,如下所示:
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小眾設(shè)計(jì)感長(zhǎng)裙氣質(zhì)顯瘦純白色仙女連衣裙", TotalPayment = 100, TotalCustomerCount = 2, TotalProductCount = 333 }; var json = JsonConvert.SerializeObject(reportModel); System.Console.WriteLine(json); } } public class ReportModel { public string ProductName { get; set; } public int TotalCustomerCount { get; set; } public decimal TotalPayment { get; set; } public int TotalProductCount { get; set; } }
那怎么辦呢? JsonConvert中提供了一個(gè) Formatting.Indented
用來(lái)格式化json,這樣在 debug 的過(guò)程中就非常友好,改造如下:
2. 踢掉沒(méi)有被賦值的字段
如果你寫過(guò)給 App 提供數(shù)據(jù)的后端服務(wù),我相信你對(duì)手機(jī)流量這個(gè)詞特別敏感,往往一個(gè) Model 上有十幾個(gè)字段,但需要傳給 App 可能就 三四個(gè)字段,這就造成了巨大的流量浪費(fèi),如下圖:
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小眾設(shè)計(jì)感長(zhǎng)裙氣質(zhì)顯瘦純白色仙女連衣裙", TotalPayment = 100 }; var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented); System.Console.WriteLine(json); }
從圖中可以看到,TotalCustomerCount 和 TotalProductCount 這兩個(gè)字段就沒(méi)必要了,Netnewsoft 中提供了 DefaultValueHandling.Ignore 剔除默認(rèn)值的枚舉,太實(shí)用了,改造如下:
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
3. 兼容其他語(yǔ)言的 駝峰,蛇形命名法
每一套編程語(yǔ)言都有各自偏好的命名法,比如 js 中都喜歡采用 駝峰命名法,在 mysql 中我見(jiàn)過(guò)最多的 蛇形命名法,而我們?cè)?C# 中序列化的屬性一般都是大寫字母開(kāi)頭,比如你看到的 特性二 中的字段,那這里就存在問(wèn)題了,有沒(méi)有辦法兼容一下,給 js 就用 駝峰,給 mysql 就用 蛇形,這樣顯得對(duì)別人友好一些,不是嘛😄😄😄,接下來(lái)看看怎么改造。
- 駝峰命名 CamelCasePropertyNamesContractResolver
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
- 蛇形命名 SnakeCaseNamingStrategy
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() } });
4. 自定義屬性的名字
如果你和第三方系統(tǒng)進(jìn)行過(guò)對(duì)接開(kāi)發(fā),通常都會(huì)遇到這個(gè)問(wèn)題,就拿 OpenTaobao 來(lái)說(shuō),我的Model總不能按照它文檔這樣定義吧,而且字段名稱也不可能做到完全一致,如下圖:
所以這里面必然要存在一個(gè) Mapping 的過(guò)程,這就可以用 JsonProperty -> propertyName 幫你搞定,為了方便演示,我還是用 reportModel 吧。
static void Main(string[] args) { var json = "{'title':'法式小眾設(shè)計(jì)感長(zhǎng)裙氣質(zhì)顯瘦純白色仙女連衣裙','customercount':1000,'totalpayment':100.0,'productcount':10000}"; var reportModel = JsonConvert.DeserializeObject<ReportModel>(json); } public class ReportModel { [JsonProperty("title")] public string ProductName { get; set; } [JsonProperty("customercount")] public int TotalCustomerCount { get; set; } [JsonProperty("totalpayment")] public decimal TotalPayment { get; set; } [JsonProperty("productcount")] public int TotalProductCount { get; set; } }
5. 對(duì)字段的 正向剔除 和 反向剔除
可能有些朋友對(duì)這兩個(gè)概念不是特別了解,這里我僅顯示 Model 中的 ProductName 為例講解一下:
- 正向剔除: 默認(rèn)所有都顯示,手工踢掉不顯示的,使用
MemberSerialization.OptOut
配合JsonIgnore
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小眾設(shè)計(jì)感長(zhǎng)裙氣質(zhì)顯瘦純白色仙女連衣裙", TotalPayment = 100 }; var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented); System.Console.WriteLine(json); } [JsonObject(MemberSerialization.OptOut)] public class ReportModel { public string ProductName { get; set; } [JsonIgnore] public int TotalCustomerCount { get; set; } [JsonIgnore] public decimal TotalPayment { get; set; } [JsonIgnore] public int TotalProductCount { get; set; } }
- 反向剔除: 默認(rèn)都不顯示,手工指定要顯示的,使用 MemberSerialization.OptIn 配合 JsonProperty
[JsonObject(MemberSerialization.OptIn)] public class ReportModel { [JsonProperty] public string ProductName { get; set; } public int TotalCustomerCount { get; set; } public decimal TotalPayment { get; set; } public int TotalProductCount { get; set; } }
6. 多個(gè)json 合并到 一個(gè)Model
這個(gè)特性當(dāng)初打破了我對(duì) Newtonsoft 的認(rèn)知觀,不知道您呢? 通常我們都會(huì)認(rèn)為 一個(gè) json 對(duì)應(yīng)一個(gè) model,一個(gè) model 對(duì)應(yīng)一個(gè) json,居然還可以多個(gè) json 對(duì)應(yīng)一個(gè) model 的情況,這就有意思了,場(chǎng)景大家可以自己想一想哈,這里使用 PopulateObject
方法就可以輕松幫你搞定,接下來(lái)看看怎么寫這個(gè)代碼:
static void Main(string[] args) { var json1 = "{'ProductName':'法式小眾設(shè)計(jì)感長(zhǎng)裙氣質(zhì)顯瘦純白色仙女連衣裙'}"; var json2 = "{'TotalCustomerCount':1000,'TotalPayment':100.0,'TotalProductCount':10000}"; var reportModel = new ReportModel(); JsonConvert.PopulateObject(json1, reportModel); JsonConvert.PopulateObject(json2, reportModel); }
是不是有點(diǎn)意思😄😄😄
三:總結(jié)
為了怕影響閱讀體驗(yàn),這一篇就先總結(jié)六個(gè)供大家欣賞,Newtonsoft 這玩意確實(shí)非常強(qiáng)大,太多的東西需要去挖掘,希望本篇對(duì)你有幫助,謝謝。
以上就是c# Newtonsoft 六個(gè)值得使用的特性(上)的詳細(xì)內(nèi)容,更多關(guān)于c# Newtonsoft 特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例
c#開(kāi)發(fā)過(guò)程中出現(xiàn)未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例,錯(cuò)誤一般是下面的原因,軟件中也是因?yàn)闆](méi)有獲取到數(shù)據(jù)導(dǎo)致,需要的朋友可以參考下2022-09-09C# 中使用Stopwatch計(jì)時(shí)器實(shí)現(xiàn)暫停計(jì)時(shí)繼續(xù)計(jì)時(shí)功能
這篇文章主要介紹了C# 中使用Stopwatch計(jì)時(shí)器可暫停計(jì)時(shí)繼續(xù)計(jì)時(shí),主要介紹stopwatch的實(shí)例代碼詳解,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C#實(shí)現(xiàn)漢字轉(zhuǎn)拼音或轉(zhuǎn)拼音首字母的方法
這篇文章主要介紹了C#實(shí)現(xiàn)漢字轉(zhuǎn)拼音或轉(zhuǎn)拼音首字母的方法,涉及C#操作數(shù)組、遍歷及正則匹配的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07使用HttpHanlder處理404:File not found的問(wèn)題
本篇文章小編為大家介紹。使用HttpHanlder處理404:File not found的問(wèn)題。需要的朋友參考下2013-04-04