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

c# Newtonsoft 六個值得使用的特性(下)

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

一:講故事

上一篇介紹的 6 個特性從園子里的反饋來看效果不錯,那這一篇就再帶來 6 個特性同大家一起欣賞。

二:特性分析

1. 像弱類型語言一樣解析 json

大家都知道弱類型的語言有很多,如: nodejs,python,php,它們有一個🐮👃的地方就是處理json,不需要像 強(qiáng)類型語言 那樣還要給它配一個類,什么意思呢? 就拿下面的 json 說事。

{
 "DisplayName": "新一代算法模型",
 "CustomerType": 1,
 "Report": {
 "TotalCustomerCount": 1000,
 "TotalTradeCount": 50
 },
 "CustomerIDHash": [1,2,3,4,5]
}

這個 json 如果想灌到 C# 中處理,你就得給它定義一個適配的類,就如 初篇 的客戶算法模型類,所以這里就有了一個需求,能不能不定義類也可以自由解析上面這串 json 呢??? 哈哈,當(dāng)然是可以的, 反序列化成 Dictionary 即可,就拿提取 Report.TotalCustomerCount CustomerIDHash 這兩個字段演示一下。

  static void Main(string[] args)
  {
   var json = @"{
       'DisplayName': '新一代算法模型',
       'CustomerType': 1,
       'Report': {
        'TotalCustomerCount': 1000,
        'TotalTradeCount': 50
       },
       'CustomerIDHash': [1,2,3,4,5]
       }";

   var dict = JsonConvert.DeserializeObject<Dictionary<object, object>>(json);

   var report = dict["Report"] as JObject;
   var totalCustomerCount = report["TotalCustomerCount"];

   Console.WriteLine($"totalCustomerCount={totalCustomerCount}");

   var arr = dict["CustomerIDHash"] as JArray;
   var list = arr.Select(m => m.Value<int>()).ToList();

   Console.WriteLine($"list={string.Join(",", list)}");
  }

2. 如何讓json中的枚舉保持更易讀的字符串型

這句話是什么意思呢? 默認(rèn)情況下, SerializeObject 會將 Model 中的 Enum 變成數(shù)值型,大家都知道數(shù)值型語義性是非常差的,如下代碼所示:

 static void Main(string[] args)
 {
  var model = new ThreadModel() { ThreadStateEnum = System.Threading.ThreadState.Running };

  var json = JsonConvert.SerializeObject(model);

  Console.WriteLine(json);
 }

 class ThreadModel
 {
  public System.Threading.ThreadState ThreadStateEnum { get; set; }
 }

對吧,確實語義特別差,那能不能直接生成 Running 這種字符串形式呢? 當(dāng)然可以了。。。改造如下:

var json = JsonConvert.SerializeObject(model, new StringEnumConverter());

這里可能就有人鉆牛角尖了,能不能部分指定讓枚舉生成 string,其他的生成 int ,沒關(guān)系,這也難不倒我,哪里使用就用 JsonConverter 標(biāo)記哪里。。。

  static void Main(string[] args)
  {
   var model = new ThreadModel()
   {
    ThreadStateEnum = System.Threading.ThreadState.Running,
    TaskStatusEnum = TaskStatus.RanToCompletion
   };

   var json = JsonConvert.SerializeObject(model);

   Console.WriteLine(json);
  }

  class ThreadModel
  {
   public System.Threading.ThreadState ThreadStateEnum { get; set; }

   [JsonConverter(typeof(StringEnumConverter))]
   public TaskStatus TaskStatusEnum { get; set; }
  } 

3. 格式化 json 中的時間類型

在 model 轉(zhuǎn)化成 json 的過程中,總少不了 時間類型,為了讓時間類型 可讀性更高,通常會 格式化為 YYYY年/MM月/dd日 ,那如何實現(xiàn)呢? 很簡單撒,在 JsonConvert 中也是一個 枚舉 幫你搞定。。。

  static void Main(string[] args)
  {
   var json = JsonConvert.SerializeObject(new Order()
   {
    OrderTitle = "女裝大佬",
    Created = DateTime.Now
   }, new JsonSerializerSettings
   {
    DateFormatString = "yyyy年/MM月/dd日",
   });

   Console.WriteLine(json);
  }
  public class Order
  {
   public string OrderTitle { get; set; }
   public DateTime Created { get; set; }
  } 

對了,我記得很早的時候,C# 自帶了一個 JavaScriptSerializer, 也是用來進(jìn)行 model 轉(zhuǎn) json的,但是它會將 datetime 轉(zhuǎn)成 時間戳,而不是時間字符串形式,如果你因為特殊原因想通過 JsonConvert 將時間生成時間戳的話,也是可以的, 用 DateFormatHandling.MicrosoftDateFormat 枚舉指定一下即可,如下:

4. 對一些常用設(shè)置進(jìn)行全局化

在之前所有演示的特性技巧中都是在 JsonConvert 上指定的,也就是說 100 個 JsonConvert 我就要指定 100 次,那有沒有類似一次指定,整個進(jìn)程通用呢? 這么強(qiáng)大的 Newtonsoft 早就支持啦, 就拿上面的 Order 舉例:

  JsonConvert.DefaultSettings = () =>
  {
   var settings = new JsonSerializerSettings
   {
    Formatting = Formatting.Indented
   };
   return settings;
  };

  var order = new Order() { OrderTitle = "女裝大佬", Created = DateTime.Now };

  var json1 = JsonConvert.SerializeObject(order);
  var json2 = JsonConvert.SerializeObject(order);

  Console.WriteLine(json1);
  Console.WriteLine(json2);

5. 如何保證 json 到 model 的嚴(yán)謹(jǐn)性 及提取 json 未知字段

有時候我們有這樣的需求,一旦 json 中出現(xiàn) model 未知的字段,有兩種選擇: 要么報錯,要么提取出未知字段,在 Newtonsoft 中默認(rèn)的情況是忽略,場景大家可以自己找哈。

  • 未知字段報錯
      static void Main(string[] args)
      {
       var json = "{'OrderTitle':'女裝大佬', 'Created':'2020/6/23','Memo':'訂單備注'}";
    
       var order = JsonConvert.DeserializeObject<Order>(json, new JsonSerializerSettings
       {
        MissingMemberHandling = MissingMemberHandling.Error
       });
    
       Console.WriteLine(order);
      }
    
      public class Order
      {
       public string OrderTitle { get; set; }
       public DateTime Created { get; set; }
       public override string ToString()
       {
        return $"OrderTitle={OrderTitle}, Created={Created}";
       }
      }

  • 提取未知字段

我依稀的記得 WCF 在這種場景下也是使用一個 ExtenstionDataObject 來存儲客戶端傳過來的未知字段,有可能是客戶端的 model 已更新,server端還是舊版本,通常在 json 序列化中也會遇到這種情況,在 JsonConvert 中使用 _additionalData 就可以幫你搞定,在 OnDeserialized 這種AOP方法中進(jìn)行攔截,如下代碼:

 static void Main(string[] args)
 {
  var json = "{'OrderTitle':'女裝大佬', 'Created':'2020/6/23','Memo':'訂單備注'}";

  var order = JsonConvert.DeserializeObject<Order>(json);

  Console.WriteLine(order);
 }

 public class Order
 {
  public string OrderTitle { get; set; }

  public DateTime Created { get; set; }

  [JsonExtensionData]
  private IDictionary<string, JToken> _additionalData;

  public Order()
  {
   _additionalData = new Dictionary<string, JToken>();
  }

  [OnDeserialized]
  private void OnDeserialized(StreamingContext context)
  {
   var dict = _additionalData;
  }

  public override string ToString()
  {
   return $"OrderTitle={OrderTitle}, Created={Created}";
  }
 } 

6. 開啟 JsonConvert 詳細(xì)日志功能

有時候在查閱源碼的時候開啟日志功能更加有利于理解源碼的內(nèi)部運作,所以這也是一個非常實用的功能,看看如何配置吧。

  static void Main(string[] args)
  {
   var json = "{'OrderTitle':'女裝大佬', 'Created':'2020/6/23','Memo':'訂單備注'}";

   MemoryTraceWriter traceWriter = new MemoryTraceWriter();

   var account = JsonConvert.DeserializeObject<Order>(json, new JsonSerializerSettings
   {
    TraceWriter = traceWriter
   });

   Console.WriteLine(traceWriter.ToString());
  }

  public class Order
  {
   public string OrderTitle { get; set; }

   public DateTime Created { get; set; }

   public override string ToString()
   {
    return $"OrderTitle={OrderTitle}, Created={Created}";
   }
  }

三:總結(jié)

嘿嘿,這篇 6 個特性就算說完了, 結(jié)合上一篇一共 12 個特性,是不是非常簡單且實用,后面準(zhǔn)備給大家?guī)硪恍┰创a解讀吧! 希望本篇對您有幫助,謝謝!

以上就是c# Newtonsoft 六個值得使用的特性(下)的詳細(xì)內(nèi)容,更多關(guān)于c# Newtonsoft 特性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# 使用計時器和觀察者模式實現(xiàn)報警推送需求

    c# 使用計時器和觀察者模式實現(xiàn)報警推送需求

    這篇文章主要介紹了c# 使用計時器和觀察者模式實現(xiàn)報警推送需求,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#中增強(qiáng)類功能的幾種方式詳解

    C#中增強(qiáng)類功能的幾種方式詳解

    這篇文章主要給大家介紹了關(guān)于C#中增強(qiáng)類功能的幾種方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 教你C#將CSV轉(zhuǎn)為Excel的實現(xiàn)方法

    教你C#將CSV轉(zhuǎn)為Excel的實現(xiàn)方法

    這篇文章主要介紹了C#?將CSV轉(zhuǎn)為Excel,轉(zhuǎn)換之后可執(zhí)行更多關(guān)于數(shù)據(jù)編輯、格式設(shè)置等操作,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-03-03
  • VS2010寫的程序在自己電腦可以運行、其他電腦上不能運行的解決方案

    VS2010寫的程序在自己電腦可以運行、其他電腦上不能運行的解決方案

    自己用Visual Studio 2010 旗艦版寫了一個軟件,在自己電腦上運行完全沒有問題,但是拷貝到其他人電腦上之后不管雙擊還是以管理身份運行,均沒有反應(yīng),進(jìn)程管理器中相關(guān)進(jìn)程也只是一閃而過
    2013-04-04
  • vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    服務(wù)(Service)對于大家來說一定不會陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開啟~關(guān)閉”而“開始~停止”其工作內(nèi)容,在這期間無需任何用戶參與
    2016-04-04
  • 在WPF中實現(xiàn)平滑滾動的方法詳解

    在WPF中實現(xiàn)平滑滾動的方法詳解

    這篇文章介紹了WPF實現(xiàn)平滑滾動的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#開發(fā)WinForm項目實現(xiàn)HTML編輯器

    C#開發(fā)WinForm項目實現(xiàn)HTML編輯器

    這篇文章介紹了C#開發(fā)WinForm項目實現(xiàn)HTML編輯器的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#串口通訊概念及簡單的實現(xiàn)方法

    C#串口通訊概念及簡單的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#串口通訊概念及簡單的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • c#后臺線程訪問前臺控件并顯示信息示例

    c#后臺線程訪問前臺控件并顯示信息示例

    這篇文章主要介紹了c#后臺線程訪問前臺控件并顯示信息示例,需要的朋友可以參考下
    2014-03-03
  • 基于C#一個制作圖像的特寫窗口

    基于C#一個制作圖像的特寫窗口

    許多網(wǎng)站都會顯示一個特寫窗口,其中顯示放大的圖像部分,以便您可以看到更多細(xì)節(jié),本文將使用C#制作一個簡單的圖像的特寫窗口,感興趣的可以了解下
    2025-01-01

最新評論

文安县| 鸡西市| 道孚县| 黄浦区| 永嘉县| 清丰县| 灵山县| 湖口县| 德令哈市| 正蓝旗| 嘉荫县| 科尔| 襄汾县| 天全县| 东丽区| 保康县| 安徽省| 民权县| 凌源市| 东源县| 甘泉县| 永德县| 河南省| 宝应县| 泰安市| 姜堰市| 丰都县| 井冈山市| 泽州县| 通州市| 南昌市| 通辽市| 宿松县| 深圳市| 湘阴县| 大悟县| 重庆市| 肃宁县| 怀集县| 墨脱县| 迭部县|