json mysql 字段 默认值_Newtonsoft.Json 六个超简单又实用的特性,值得一试 【上篇】...
发布日期:2021-06-24 11:30:41 浏览次数:3 分类:技术文章

本文共 4535 字,大约阅读时间需要 15 分钟。

看完官方文档,阅读了一些 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; } }
5fadb347ef206ec011aedfdd83a511e4.png

那怎么办呢?JsonConvert 中提供了一个 Formatting.Indented 用来格式化 json,这样在 debug 的过程中就非常友好,改造如下:

354b15754a9751a1a0b2322279954a0d.png

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

87c96b9b574e5aeb110ea540dd7831cd.png

从图中可以看到,TotalCustomerCount 和 TotalProductCount 这两个字段就没必要了,Netnewsoft 中提供了 DefaultValueHandling.Ignore 剔除默认值的枚举,太实用了,改造如下:

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

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

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

驼峰命名 CamelCasePropertyNamesContractResolver

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

a432f0a766b464b46be7f78c475400c6.png

蛇形命名 SnakeCaseNamingStrategy

var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,new JsonSerializerSettings     {
ContractResolver = new DefaultContractResolver() {
NamingStrategy = new SnakeCaseNamingStrategy() } });

1abf21bd7cff85eec8d3e3b9470e837c.png

4. 自定义属性的名字

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

463cf0609a962c3d8d958094b692482c.png

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

static void Main(string[] args) {
var json = "{'title':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙','customercount':1000,'totalpayment':100.0,'productcount':10000}";var reportModel = JsonConvert.DeserializeObject(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; } }
99f61b97db67edfef34d59cbff467050.png

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

c0e3f215792c50b5afa52a55166097ba.png

反向剔除:默认都不显示,手工指定要显示的,使用 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; } }
fc48d55c2be34e3a0726bd66f7bc61a8.png

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

99f61b97db67edfef34d59cbff467050.png

是不是有点意思 ???

总结

为了怕影响阅读体验,这一篇就先总结六个供大家欣赏,Newtonsoft 这玩意确实非常强大,太多的东西需要去挖掘,希望本篇对你有帮助,谢谢。

转载地址:https://blog.csdn.net/weixin_32512381/article/details/112448729 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ocdma相干非相干_《Acconeer 60GHz脉冲相干雷达芯片:A111》
下一篇:nat优缺点_一篇就够!锂电周报:Joule、Nat. Commun.、Angew、Adv. Sci.、AEM、AFM等

发表评论

最新留言

不错!
[***.144.177.141]2024年04月16日 17时37分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章