看完官方文档,阅读了一些 Newtonsoft
源码,对它有了新的认识,先总结 六个超经典又实用的特性,同你们一块儿分享,废话很少说,快来一块儿看看吧~~~mysql
若是你直接使用 JsonConvert.SerializeObject
的话,默认状况下全部的json是挤压在一块的,特别不方便阅读,以下所示:sql
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 的过程当中就很是友好,改造以下:编程
若是你写过给 App 提供数据的后端服务,我相信你对手机流量这个词特别敏感,每每一个 Model 上有十几个字段,但须要传给 App 可能就 三四个字段,这就形成了巨大的流量浪费,以下图:json
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 });
每一套编程语言都有各自偏好的命名法,好比 js 中都喜欢采用 驼峰命名法,在 mysql 中我见过最多的 蛇形命名法,而咱们在 C# 中序列化的属性通常都是大写字母开头,好比你看到的 特性二
中的字段,那这里就存在问题了,有没有办法兼容一下,给 js 就用 驼峰,给 mysql 就用 蛇形,这样显得对别人友好一些,不是嘛😄😄😄,接下来看看怎么改造。app
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() } });
若是你和第三方系统进行过对接开发,一般都会遇到这个问题,就拿 OpenTaobao 来讲,个人Model总不能按照它文档这样定义吧,并且字段名称也不可能作到彻底一致,以下图:编程语言
因此这里面必然要存在一个 Mapping 的过程,这就能够用 JsonProperty -> propertyName
帮你搞定,为了方便演示,我仍是用 reportModel 吧。debug
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; } }
可能有些朋友对这两个概念不是特别了解,这里我仅显示 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; } }
这个特性当初打破了我对 Newtonsoft 的认知观,不知道您呢? 一般咱们都会认为 一个 json 对应一个 model,一个 model 对应一个 json,竟然还能够多个 json 对应一个 model 的状况,这就有意思了,场景你们能够本身想想哈,这里使用 PopulateObject
方法就能够轻松帮你搞定,接下来看看怎么写这个代码:3d
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 这玩意确实很是强大,太多的东西须要去挖掘,但愿本篇对你有帮助,谢谢。