Newtonsoft 六个超简单又实用的特性,值得一试 【上篇】
一:讲故事
看完官方文档,阅读了一些 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; }
}
那怎么办呢? JsonConvert中提供了一个 Formatting.Indented
用来格式化json,这样在 debug 的过程中就非常友好,改造如下:
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);
}
从图中可以看到,TotalCustomerCount
和 TotalProductCount
这两个字段就没必要了,Netnewsoft 中提供了 DefaultValueHandling.Ignore
剔除默认值的枚举,太实用了,改造如下:
var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore
});
3. 兼容其他语言的 驼峰,蛇形命名法
每一套编程语言都有各自偏好的命名法,比如 js 中都喜欢采用 驼峰命名法,在 mysql 中我见过最多的 蛇形命名法,而我们在 C# 中序列化的属性一般都是大写字母开头,比如你看到的 特性二
中的字段,那这里就存在问题了,有没有办法兼容一下,给 js 就用 驼峰,给 mysql 就用 蛇形,这样显得对别人友好一些,不是嘛,接下来看看怎么改造。
- 驼峰命名 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; }
}
- 反向剔除: 默认都不显示,手工指定要显示的,使用
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; }
}
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 六个超简单又实用的特性,值得一试 【上篇】的更多相关文章
- Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】
一:讲故事 上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏. 二:特性分析 1. 像弱类型语言一样解析 json 大家都知道弱类型的语言有很多,如: n ...
- ASP.NET中一种超简单的Ajax解决方案
为什么是Ajax2? 因为之前有一个blqw.Ajax,并且已经在项目中投入使用了,但是没有这个方便,这个是后来才弄的,为了纪念第一版的blqw.Ajax,所以这个就2了... 话说看了评论才发现,原 ...
- 超简单的全新win10安装
1.准备工作! 这里说一下需要装系统的东西: 至少8G的U盘或内存卡 一台Windows电脑 在要安装的电脑上至少有16G的空间,最好至少64G. 2.现成电脑下载文件(已经有重装系统U盘跳过这一步) ...
- 分享六个基于Bootstrap的实用开发教程和模板演示
关于Bootstrap,相信大家一定不陌生,它已经成为现在主流产业的一个重要工具,Bootstrap提供了优雅的HTML和CSS规范,它基于jQuery框架开发的,它在jQuery框架的基础上进行了更 ...
- 【Android自己定义View实战】之自己定义超简单SearchView搜索框
[Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...
- 【转载】手把手教你使用Git(简单,实用)
手把手教你使用Git(简单,实用) 标签: git 2016年04月21日 20:51:45 1328人阅读 评论(0) 收藏 举报 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...
- 超简单集成 HMS ML Kit 实现最大脸微笑抓拍
前言 如果大家对 HMS ML Kit 人脸检测功能有所了解,相信已经动手调用我们提供的接口编写自己的 APP 啦.目前就有小伙伴在调用接口的过程中反馈,不太清楚 HMS ML Kit 文档中的 ML ...
- 把C#程序(含多个Dll)合并成一个Exe的超简单方法
开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...
- 记住密码超简单实现(C#)
实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...
随机推荐
- 问答题:你下班后是选择关电脑?Or,只关闭显示器?
首百问答的答案:jingmentudou 因为你永远不知道什么时间会被叫醒.开个远程就能避免半夜去公司了. 月尧jade 干这一行的,电脑自按下开机键开始,除了驱动会自动启动外,你需要重新检查各大运行 ...
- 微信小程序初探--写个扫雷分享给你玩
闲暇里,想学一下微信小程序, 于是,用微信小程序原生做了个扫雷玩. 以下略作总结,分享给大家. 微信里下拉,输入[mini计算器], 看到这个图标的就是了: 说好的扫雷,怎么变成计算器了?原因后面解释 ...
- 读了这一篇,让你少踩 ArrayList 的那些坑
我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...
- [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- python 反向shell后门
linux 编码改为utf-8,windows 默认gbk,python一般都是白名单减少查杀可能性,端口可以改为443,ssl混肴数据传输. python client端 import subpro ...
- web-信息泄露基础知识总结(持续更新)
web-信息泄露 1.git泄露 Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等.发布代码的时候,如果没 ...
- SpringBoot 及其 基本原理(一)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 前言: 分布式架构及微服务理念 1.SOA理念(思想) SOA :即 Service Oriented ...
- Java实现蓝桥杯VIP 算法训练 矩阵乘方
import java.util.Scanner; public class 矩阵乘方 { public static void main(String[] args) { Scanner scann ...
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- Java实现 LeetCode 51 N皇后
51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决 ...