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

2020-06-23 12:01:49王旭

驼峰命名 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; }
 }