c# Newtonsoft 六个值得使用的特性(上)

 更新时间:2020年06月23日 10:21:48   作者:一线码农  
这篇文章主要介绍了c# Newtonsoft 六个值得使用的特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

一:讲故事

看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的认识,先总结 六个超经典又实用的特性,同大家一起分享,废话不多说,快来一起看看吧~~~

二:特性分析

1. 代码格式化

如果你直接使用 JsonConvert.SerializeObject的话,默认情况下所有的json是挤压在一块的,特别不方便阅读,如下所示:

 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 的过程中就非常友好,改造如下:

2. 踢掉没有被赋值的字段

如果你写过给 App 提供数据的后端服务,我相信你对手机流量这个词特别敏感,往往一个 Model 上有十几个字段,但需要传给 App 可能就 三四个字段,这就造成了巨大的流量浪费,如下图:

 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
  });

3. 兼容其他语言的 驼峰,蛇形命名法

每一套编程语言都有各自偏好的命名法,比如 js 中都喜欢采用 驼峰命名法,在 mysql 中我见过最多的 蛇形命名法,而我们在 C# 中序列化的属性一般都是大写字母开头,比如你看到的 特性二 中的字段,那这里就存在问题了,有没有办法兼容一下,给 js 就用 驼峰,给 mysql 就用 蛇形,这样显得对别人友好一些,不是嘛😄😄😄,接下来看看怎么改造。

  • 驼峰命名 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. 自定义属性的名字

如果你和第三方系统进行过对接开发,通常都会遇到这个问题,就拿 OpenTaobao 来说,我的Model总不能按照它文档这样定义吧,而且字段名称也不可能做到完全一致,如下图:

所以这里面必然要存在一个 Mapping 的过程,这就可以用 JsonProperty -> propertyName 帮你搞定,为了方便演示,我还是用 reportModel 吧。

 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; }
 }

5. 对字段的 正向剔除 和 反向剔除

可能有些朋友对这两个概念不是特别了解,这里我仅显示 Model 中的 ProductName 为例讲解一下:

  • 正向剔除: 默认所有都显示,手工踢掉不显示的,使用 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; }
     }

6. 多个json 合并到 一个Model

这个特性当初打破了我对 Newtonsoft 的认知观,不知道您呢? 通常我们都会认为 一个 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 这玩意确实非常强大,太多的东西需要去挖掘,希望本篇对你有帮助,谢谢。

以上就是c# Newtonsoft 六个值得使用的特性(上)的详细内容,更多关于c# Newtonsoft 特性的资料请关注脚本之家其它相关文章!

相关文章

  • C# 未将对象引用设置到对象的实例

    C# 未将对象引用设置到对象的实例

    c#开发过程中出现未将对象引用设置到对象的实例,错误一般是下面的原因,软件中也是因为没有获取到数据导致,需要的朋友可以参考下
    2022-09-09
  • c#如何显式实现接口成员

    c#如何显式实现接口成员

    这篇文章主要介绍了c#如何显式实现接口成员,帮助大家更好的利用c#处理接口,感兴趣的朋友可以了解下
    2020-10-10
  • C# 中使用Stopwatch计时器实现暂停计时继续计时功能

    C# 中使用Stopwatch计时器实现暂停计时继续计时功能

    这篇文章主要介绍了C# 中使用Stopwatch计时器可暂停计时继续计时,主要介绍stopwatch的实例代码详解,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#实现缩放和剪裁图片的方法示例

    C#实现缩放和剪裁图片的方法示例

    这篇文章主要介绍了C#实现缩放和剪裁图片的方法,结合实例形式分析了C#针对图片属性的缩放、裁剪等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C#实现汉字转拼音或转拼音首字母的方法

    C#实现汉字转拼音或转拼音首字母的方法

    这篇文章主要介绍了C#实现汉字转拼音或转拼音首字母的方法,涉及C#操作数组、遍历及正则匹配的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解MongoDB for C#基础入门

    详解MongoDB for C#基础入门

    本篇文章主要介绍了MongoDB for C#基础入门,具体介绍了c#中关于对MongoDB的连接,插入,查询等,有需要的可以了解一下。
    2016-12-12
  • C#随机数生成字母金字塔

    C#随机数生成字母金字塔

    这篇文章主要为大家详细介绍了C#随机数生成字母金字塔,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 使用HttpHanlder处理404:File not found的问题

    使用HttpHanlder处理404:File not found的问题

    本篇文章小编为大家介绍。使用HttpHanlder处理404:File not found的问题。需要的朋友参考下
    2013-04-04
  • C#中改变DataGridView控件边框颜色的方法

    C#中改变DataGridView控件边框颜色的方法

    这篇文章主要介绍了C#中改变DataGridView控件边框颜色的方法,默认的DataGridView边框颜色很丑,本文用编程方法实现修改DataGridView边框颜色,需要的朋友可以参考下
    2014-08-08
  • C#实现截图工具小项目

    C#实现截图工具小项目

    这篇文章主要为大家详细介绍了C#实现截图工具小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论