最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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í)用的特性,同大家一起分享,廢話不多說,快來一起看看吧~~~

二:特性分析

1. 代碼格式化

如果你直接使用 JsonConvert.SerializeObject的話,默認(rèn)情況下所有的json是擠壓在一塊的,特別不方便閱讀,如下所示:

 static void Main(string[] args)
 {
  var reportModel = new ReportModel()
  {
  ProductName = "法式小眾設(shè)計(jì)感長裙氣質(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 用來格式化json,這樣在 debug 的過程中就非常友好,改造如下:

2. 踢掉沒有被賦值的字段

如果你寫過給 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ì)顯瘦純白色仙女連衣裙",
  TotalPayment = 100
  };

  var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented);

  System.Console.WriteLine(json);
 }

從圖中可以看到,TotalCustomerCount 和 TotalProductCount 這兩個(gè)字段就沒必要了,Netnewsoft 中提供了 DefaultValueHandling.Ignore 剔除默認(rèn)值的枚舉,太實(shí)用了,改造如下:

var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
 new JsonSerializerSettings
  {
  DefaultValueHandling = DefaultValueHandling.Ignore
  });

3. 兼容其他語言的 駝峰,蛇形命名法

每一套編程語言都有各自偏好的命名法,比如 js 中都喜歡采用 駝峰命名法,在 mysql 中我見過最多的 蛇形命名法,而我們在 C# 中序列化的屬性一般都是大寫字母開頭,比如你看到的 特性二 中的字段,那這里就存在問題了,有沒有辦法兼容一下,給 js 就用 駝峰,給 mysql 就用 蛇形,這樣顯得對(duì)別人友好一些,不是嘛😄😄😄,接下來看看怎么改造。

  • 駝峰命名 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)行過對(duì)接開發(fā),通常都會(huì)遇到這個(gè)問題,就拿 OpenTaobao 來說,我的Model總不能按照它文檔這樣定義吧,而且字段名稱也不可能做到完全一致,如下圖:

所以這里面必然要存在一個(gè) Mapping 的過程,這就可以用 JsonProperty -> propertyName 幫你搞定,為了方便演示,我還是用 reportModel 吧。

 static void Main(string[] args)
 {
 var json = "{'title':'法式小眾設(shè)計(jì)感長裙氣質(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ì)顯瘦純白色仙女連衣裙",
      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 的情況,這就有意思了,場景大家可以自己想一想哈,這里使用 PopulateObject 方法就可以輕松幫你搞定,接下來看看怎么寫這個(gè)代碼:

 static void Main(string[] args)
 {
  var json1 = "{'ProductName':'法式小眾設(shè)計(jì)感長裙氣質(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 特性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫效果的Form和FormItem

    c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫效果的Form和FormItem

    這篇文章主要介紹了c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫效果的Form和FormItem,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C# SQLite數(shù)據(jù)庫入門使用說明

    C# SQLite數(shù)據(jù)庫入門使用說明

    這篇文章主要給大家介紹了關(guān)于C#中SQLite數(shù)據(jù)庫入門使用的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    這篇文章主要介紹了WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例,對(duì)窗體上各個(gè)部位進(jìn)行定義,從而實(shí)現(xiàn)了點(diǎn)擊特效,需要的朋友可以參考下
    2014-09-09
  • C# DataTable分頁處理實(shí)例代碼

    C# DataTable分頁處理實(shí)例代碼

    有時(shí)候我們從數(shù)據(jù)庫獲取的數(shù)據(jù)量太大,而我們不需要一次性顯示那么多的時(shí)候,我們就要對(duì)數(shù)據(jù)進(jìn)行分頁處理了,讓每頁顯示不同的數(shù)據(jù)。
    2017-06-06
  • C#中Json的簡單處理方法

    C#中Json的簡單處理方法

    這篇文章主要介紹了C#中Json的簡單處理方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • C# WINFORM 強(qiáng)制讓窗體獲得焦點(diǎn)的方法代碼

    C# WINFORM 強(qiáng)制讓窗體獲得焦點(diǎn)的方法代碼

    C# WINFORM 強(qiáng)制讓窗體獲得焦點(diǎn)的方法代碼,需要的朋友可以參考一下
    2013-04-04
  • C#中struct與class的區(qū)別詳解

    C#中struct與class的區(qū)別詳解

    本文主要介紹了C#中struct與class的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 如何最大限度地降低多線程C#代碼的復(fù)雜性

    如何最大限度地降低多線程C#代碼的復(fù)雜性

    這篇文章主要介紹了如何最大限度地降低多線程C#代碼的復(fù)雜性,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • C#獲取路徑的幾種方式實(shí)例分析

    C#獲取路徑的幾種方式實(shí)例分析

    這篇文章主要介紹了C#獲取路徑的幾種方式,實(shí)例分析了C#常用的路徑操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#中Thread.CurrentThread的用法小結(jié)

    C#中Thread.CurrentThread的用法小結(jié)

    本文主要介紹了C#中Thread.CurrentThread的用法小結(jié),通過Thread.CurrentThread可以訪問和修改當(dāng)前線程的各種屬性和方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04

最新評(píng)論

江都市| 贵定县| 绥德县| 开远市| 浦江县| 文山县| 桐柏县| 南澳县| 林州市| 滨州市| 监利县| 饶河县| 太原市| 黔西县| 孟津县| 闻喜县| 平果县| 宝丰县| 周至县| 佳木斯市| 巨鹿县| 平安县| 九江市| 巴楚县| 海盐县| 张家界市| 凭祥市| 五台县| 白山市| 来安县| 淮阳县| 宾川县| 沙河市| 富平县| 浦县| 兴隆县| 巨野县| 海宁市| 柳林县| 竹北市| 焦作市|