欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# Newtonsoft 六個(gè)值得使用的特性(上)

 更新時(shí)間:2020年06月23日 10:21:48   作者:一線碼農(nóng)  
這篇文章主要介紹了c# Newtonsoft 六個(gè)值得使用的特性,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

一:講故事

看完官方文檔,閱讀了一些 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)文章

最新評(píng)論