Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】一 讲故事看完官方文档 阅读了一些 Newtonsoft 源码 对它有了新的认识 先总结六个超经典又实用的特性 同大家一起分享 废话不多说 快来一起看看吧 二 特性分析 1 代码格式化如果你直接使用 JsonConvert SerializeObj 的话 默认情况下所有的 json 是挤压在一块的 特别不方便阅读 如下所示 staticvoidMa string args varreportMod

一:讲故事

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

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

  • 驼峰命名 CamelCasePropertyNamesContractResolver
 var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

4. 自定义属性的名字

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

所以这里面必然要存在一个 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; } } 

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】

  • 反向剔除: 默认都不显示,手工指定要显示的,使用 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 六个超简单又实用的特性,值得一试 【上篇】

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 六个超简单又实用的特性,值得一试 【上篇】

是不是有点意思???

三:总结

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

下一篇​​​​​​​

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232888.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • stata 求输出相关系数矩阵命令_一文读懂结果输出命令大全(上)

    stata 求输出相关系数矩阵命令_一文读懂结果输出命令大全(上)目录描述统计量helptabstat//Stata官方命令描述统计量组间均值差异检验helpttesthelpttable2helpestout相关分析命令helppwcorrhelppwcorr_a回归相关分析命令helpesttabhelpoutreg2helplogoutstata命令汇总helpsum2docx//输出基…

    2022年6月15日
    221
  • svn里update以后还是有红色的感叹号怎么办

    svn里update以后还是有红色的感叹号怎么办

    2021年10月31日
    169
  • ITOP4412 RFID RC522模块

    ITOP4412 RFID RC522模块RC522是高度集成的非接触式读写卡芯片。此发送模块利用调制和解调原理,并将它们完全集成到各种非接触式通信方法和协议中。可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。该模块有64字节的发送和接收FIFO缓冲区。本次使用的模块如下(图从网上剪切)iTop4412提供RFID模块驱动,而且手中有该模块,只是一直没有使用过,所以找出来调试一番。该模块可使用S…

    2022年7月14日
    20
  • SVG可伸缩的矢量图形「建议收藏」

    SVG可伸缩的矢量图形「建议收藏」SVG可伸缩的矢量图形

    2022年4月20日
    51
  • java按位取反运算符_二进制按位取反

    java按位取反运算符_二进制按位取反“~”运算符在c、c++、java、c#中都有,要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。另外正数和负数的补码不一样,正数的补码,反码都是其本身,既:正数9(二进制为:1001)在内存中存储为01001,必须补上符号位(开头的0为符号位)。补码为01001反码为01001,其中前面加的0是符号位,负数的

    2022年8月14日
    8
  • ubuntu下deb包安装方法_ubuntu安装下载文件

    ubuntu下deb包安装方法_ubuntu安装下载文件deb包是Debian,Ubuntu等Linux发行版的软件安装包,扩展名为.deb,是类似于rpm的软件包,Debian,Ubuntu系统不推荐使用deb软件包,因为要解决软件包依赖问题,安装也比较麻烦。如果Ubuntu要安装新软件,已有deb安装包(例如:linuxidc.deb),但是无法登录到桌面环境。那该怎么安装?答案是:使用dpkg命令。dpkg是Debianlinuxidc的简写,是为Debian专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自Debian的Linux发行

    2022年10月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号