看完官方文檔,閱讀了一些 Newtonsoft
源碼,對它有了新的認識,先總結 六個超經典又實用的特性,同你們一塊兒分享,廢話很少說,快來一塊兒看看吧~~~mysql
若是你直接使用 JsonConvert.SerializeObject
的話,默認狀況下全部的json是擠壓在一塊的,特別不方便閱讀,以下所示:sql
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小衆設計感長裙氣質顯瘦純白色仙女連衣裙", 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中提供了一個 Formatting.Indented
用來格式化json,這樣在 debug 的過程當中就很是友好,改造以下:編程
若是你寫過給 App 提供數據的後端服務,我相信你對手機流量這個詞特別敏感,每每一個 Model 上有十幾個字段,但須要傳給 App 可能就 三四個字段,這就形成了巨大的流量浪費,以下圖:json
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小衆設計感長裙氣質顯瘦純白色仙女連衣裙", TotalPayment = 100 }; var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented); System.Console.WriteLine(json); }
從圖中能夠看到,TotalCustomerCount
和 TotalProductCount
這兩個字段就不必了,Netnewsoft 中提供了 DefaultValueHandling.Ignore
剔除默認值的枚舉,太實用了,改造以下:後端
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
每一套編程語言都有各自偏好的命名法,好比 js 中都喜歡採用 駝峯命名法,在 mysql 中我見過最多的 蛇形命名法,而咱們在 C# 中序列化的屬性通常都是大寫字母開頭,好比你看到的 特性二
中的字段,那這裏就存在問題了,有沒有辦法兼容一下,給 js 就用 駝峯,給 mysql 就用 蛇形,這樣顯得對別人友好一些,不是嘛😄😄😄,接下來看看怎麼改造。app
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() } });
若是你和第三方系統進行過對接開發,一般都會遇到這個問題,就拿 OpenTaobao 來講,個人Model總不能按照它文檔這樣定義吧,並且字段名稱也不可能作到徹底一致,以下圖:編程語言
因此這裏面必然要存在一個 Mapping 的過程,這就能夠用 JsonProperty -> propertyName
幫你搞定,爲了方便演示,我仍是用 reportModel 吧。spa
static void Main(string[] args) { var json = "{'title':'法式小衆設計感長裙氣質顯瘦純白色仙女連衣裙','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; } }
可能有些朋友對這兩個概念不是特別瞭解,這裏我僅顯示 Model 中的 ProductName 爲例講解一下:debug
MemberSerialization.OptOut
配合 JsonIgnore
static void Main(string[] args) { var reportModel = new ReportModel() { ProductName = "法式小衆設計感長裙氣質顯瘦純白色仙女連衣裙", 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; } }
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; } }
<font color="red">這個特性當初打破了我對 Newtonsoft 的認知觀,不知道您呢?</font> 一般咱們都會認爲 一個 json 對應一個 model,一個 model 對應一個 json,竟然還能夠多個 json 對應一個 model 的狀況,這就有意思了,場景你們能夠本身想想哈,這裏使用 PopulateObject
方法就能夠輕鬆幫你搞定,接下來看看怎麼寫這個代碼:設計
static void Main(string[] args) { var json1 = "{'ProductName':'法式小衆設計感長裙氣質顯瘦純白色仙女連衣裙'}"; var json2 = "{'TotalCustomerCount':1000,'TotalPayment':100.0,'TotalProductCount':10000}"; var reportModel = new ReportModel(); JsonConvert.PopulateObject(json1, reportModel); JsonConvert.PopulateObject(json2, reportModel); }
是否是有點意思😄😄😄
爲了怕影響閱讀體驗,這一篇就先總結六個供你們欣賞,Newtonsoft 這玩意確實很是強大,太多的東西須要去挖掘,但願本篇對你有幫助,謝謝。