一:讲故事

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

二:特性分析

1. 代码格式化

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


  1. static void Main(string[] args)
  2. {
  3. var reportModel = new ReportModel()
  4. {
  5. ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
  6. TotalPayment = 100,
  7. TotalCustomerCount = 2,
  8. TotalProductCount = 333
  9. };
  10. var json = JsonConvert.SerializeObject(reportModel);
  11. System.Console.WriteLine(json);
  12. }
  13. }
  14. public class ReportModel
  15. {
  16. public string ProductName { get; set; }
  17. public int TotalCustomerCount { get; set; }
  18. public decimal TotalPayment { get; set; }
  19. public int TotalProductCount { get; set; }
  20. }

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

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

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


  1. static void Main(string[] args)
  2. {
  3. var reportModel = new ReportModel()
  4. {
  5. ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
  6. TotalPayment = 100
  7. };
  8. var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented);
  9. System.Console.WriteLine(json);
  10. }

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


  1. var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
  2. new JsonSerializerSettings
  3. {
  4. DefaultValueHandling = DefaultValueHandling.Ignore
  5. });

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

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

  • 驼峰命名 CamelCasePropertyNamesContractResolver

  1. var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
  2. new JsonSerializerSettings
  3. {
  4. ContractResolver = new CamelCasePropertyNamesContractResolver()
  5. });

  • 蛇形命名 SnakeCaseNamingStrategy

  1. var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
  2. new JsonSerializerSettings
  3. {
  4. ContractResolver = new DefaultContractResolver()
  5. {
  6. NamingStrategy = new SnakeCaseNamingStrategy()
  7. }
  8. });

4. 自定义属性的名字

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

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


  1. static void Main(string[] args)
  2. {
  3. var json = "{'title':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙','customercount':1000,'totalpayment':100.0,'productcount':10000}";
  4. var reportModel = JsonConvert.DeserializeObject<ReportModel>(json);
  5. }
  6. public class ReportModel
  7. {
  8. [JsonProperty("title")] public string ProductName { get; set; }
  9. [JsonProperty("customercount")] public int TotalCustomerCount { get; set; }
  10. [JsonProperty("totalpayment")] public decimal TotalPayment { get; set; }
  11. [JsonProperty("productcount")] public int TotalProductCount { get; set; }
  12. }

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

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

  • 正向剔除: 默认所有都显示,手工踢掉不显示的,使用 MemberSerialization.OptOut 配合 JsonIgnore

  1. static void Main(string[] args)
  2. {
  3. var reportModel = new ReportModel()
  4. {
  5. ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
  6. TotalPayment = 100
  7. };
  8. var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented);
  9. System.Console.WriteLine(json);
  10. }
  11. [JsonObject(MemberSerialization.OptOut)]
  12. public class ReportModel
  13. {
  14. public string ProductName { get; set; }
  15. [JsonIgnore] public int TotalCustomerCount { get; set; }
  16. [JsonIgnore] public decimal TotalPayment { get; set; }
  17. [JsonIgnore] public int TotalProductCount { get; set; }
  18. }

  • 反向剔除: 默认都不显示,手工指定要显示的,使用 MemberSerialization.OptIn 配合 JsonProperty

  1. [JsonObject(MemberSerialization.OptIn)]
  2. public class ReportModel
  3. {
  4. [JsonProperty] public string ProductName { get; set; }
  5. public int TotalCustomerCount { get; set; }
  6. public decimal TotalPayment { get; set; }
  7. public int TotalProductCount { get; set; }
  8. }

6. 多个json 合并到 一个Model

这个特性当初打破了我对 Newtonsoft 的认知观,不知道您呢? 通常我们都会认为 一个 json 对应一个 model,一个 model 对应一个 json,居然还可以多个 json 对应一个 model 的情况,这就有意思了,场景大家可以自己想一想哈,这里使用 PopulateObject 方法就可以轻松帮你搞定,接下来看看怎么写这个代码:


  1. static void Main(string[] args)
  2. {
  3. var json1 = "{'ProductName':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙'}";
  4. var json2 = "{'TotalCustomerCount':1000,'TotalPayment':100.0,'TotalProductCount':10000}";
  5. var reportModel = new ReportModel();
  6. JsonConvert.PopulateObject(json1, reportModel);
  7. JsonConvert.PopulateObject(json2, reportModel);
  8. }

是不是有点意思

三:总结

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

Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】的更多相关文章

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

    一:讲故事 上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏. 二:特性分析 1. 像弱类型语言一样解析 json 大家都知道弱类型的语言有很多,如: n ...

  2. ASP.NET中一种超简单的Ajax解决方案

    为什么是Ajax2? 因为之前有一个blqw.Ajax,并且已经在项目中投入使用了,但是没有这个方便,这个是后来才弄的,为了纪念第一版的blqw.Ajax,所以这个就2了... 话说看了评论才发现,原 ...

  3. 超简单的全新win10安装

    1.准备工作! 这里说一下需要装系统的东西: 至少8G的U盘或内存卡 一台Windows电脑 在要安装的电脑上至少有16G的空间,最好至少64G. 2.现成电脑下载文件(已经有重装系统U盘跳过这一步) ...

  4. 分享六个基于Bootstrap的实用开发教程和模板演示

    关于Bootstrap,相信大家一定不陌生,它已经成为现在主流产业的一个重要工具,Bootstrap提供了优雅的HTML和CSS规范,它基于jQuery框架开发的,它在jQuery框架的基础上进行了更 ...

  5. 【Android自己定义View实战】之自己定义超简单SearchView搜索框

    [Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...

  6. 【转载】手把手教你使用Git(简单,实用)

    手把手教你使用Git(简单,实用) 标签: git 2016年04月21日 20:51:45 1328人阅读 评论(0) 收藏 举报 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...

  7. 超简单集成 HMS ML Kit 实现最大脸微笑抓拍

    前言 如果大家对 HMS ML Kit 人脸检测功能有所了解,相信已经动手调用我们提供的接口编写自己的 APP 啦.目前就有小伙伴在调用接口的过程中反馈,不太清楚 HMS ML Kit 文档中的 ML ...

  8. 把C#程序(含多个Dll)合并成一个Exe的超简单方法

    开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...

  9. 记住密码超简单实现(C#)

    实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...

随机推荐

  1. 问答题:你下班后是选择关电脑?Or,只关闭显示器?

    首百问答的答案:jingmentudou 因为你永远不知道什么时间会被叫醒.开个远程就能避免半夜去公司了. 月尧jade 干这一行的,电脑自按下开机键开始,除了驱动会自动启动外,你需要重新检查各大运行 ...

  2. 微信小程序初探--写个扫雷分享给你玩

    闲暇里,想学一下微信小程序, 于是,用微信小程序原生做了个扫雷玩. 以下略作总结,分享给大家. 微信里下拉,输入[mini计算器], 看到这个图标的就是了: 说好的扫雷,怎么变成计算器了?原因后面解释 ...

  3. 读了这一篇,让你少踩 ArrayList 的那些坑

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  4. [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. python 反向shell后门

    linux 编码改为utf-8,windows 默认gbk,python一般都是白名单减少查杀可能性,端口可以改为443,ssl混肴数据传输. python client端 import subpro ...

  6. web-信息泄露基础知识总结(持续更新)

    web-信息泄露 1.git泄露 Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等.发布代码的时候,如果没 ...

  7. SpringBoot 及其 基本原理(一)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前言: 分布式架构及微服务理念 1.SOA理念(思想) SOA :即 Service Oriented ...

  8. Java实现蓝桥杯VIP 算法训练 矩阵乘方

    import java.util.Scanner; public class 矩阵乘方 { public static void main(String[] args) { Scanner scann ...

  9. Java实现 LeetCode 306 累加数

    306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...

  10. Java实现 LeetCode 51 N皇后

    51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决 ...