[.Net Core 3.0+/.Net 5] System.Text.Json中时间格式化
简介
.Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Json)
时间格式化的不足
System.Text.Json的优点就不说了,来说一下不完善的地方,毕竟一个新事物出来,不可能十全十美的,用的最多的就是时间的格式化
官方文档:在 System.Text.Json 中,具有内置支持的唯一格式是
ISO 8601-1:2019,因为它被广泛采用、意义明确并且可精确地进行往返。 若要使用任何其他格式,请创建自定义转换器
ISO 8601-1:2019通俗的说就是时间格式化为2020-11-11T21:08:18。ISO 8601-1:2019标准参考:ISO官网 | 百度百科 | wikipedia
但我们一般用的时候不想要这种格式,因为中间有一个T,前端处理起来很麻烦,最好还是返回指定的时间格式,例如:yyyy-MM-dd、yyyy-MM-dd HH:mm:ss。
解决方案
既然官方不内置提供指定时间格式化的方式,那就没办法了吗,查阅文档发现,虽然无法简单的实现功能,但是可以通过创建自定义转换器来实现相应功能
文档地址:微软官方文档
以下是一个自定义时间转化器的完整实现:
public class DateTimeConverterUsingDateTimeParse : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
使用
代码看起来非常简单是不是,只需要重写Read和Write,但是我们只是写了一个自定义转换器,怎么让它生效呢,请往下看:
JsonSerializer.Serialize()和JsonSerializer.Deserialize()方法都接受一个JsonSerializerOptions类型的配置项参数
在JsonSerializerOptions添加Converters就可以了
JsonSerializerOptions options = new JsonSerializerOptions()
{
Converters.Add(new DateTimeConverterUsingDateTimeParse())
}
string jsonString = JsonSerializer.Serialize(data, options);
至此,我们已经实现使用System.Text.Json库指定时间格式字符串进行序列化和反序列化,你甚至可以把yyyy-MM-dd HH:mm:ss做成参数来更自由的指定格式化字符串
基准测试
但是凡事有利就有弊,官方文档也说得很清楚了:
使用自定义转换器与使用序列化程序的本机实现相比,此方法的性能大大降低
有人就想知道了,到底会影响多少性能呢,我进行了一项基准测试,序列化100000条数据,包含时间处理,模型如下:
public class Dto
{
public string Name { get; set; }
public string Phone { get; set; }
public DateTime DateTime { get; set; }
}
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=5.0.100-rc.2.20479.15
[Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT [AttachedDebugger]
DefaultJob : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
System.Text.Json Version 5.0.0
Newtonsoft.Json Version 12.0.3
| Method | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|
| SystemTextJsonConverterDate | 67.36 ms | 0.489 ms | 0.458 ms | 2250.0000 | 750.0000 | 750.0000 | 52.15 MB |
| SystemTextJson | 53.26 ms | 0.231 ms | 0.180 ms | 500.0000 | 500.0000 | 500.0000 | 48.67 MB |
| NewtonsoftJsonConverterDate | 123.42 ms | 1.847 ms | 1.727 ms | 5800.0000 | 2200.0000 | 600.0000 | 51.61 MB |
| NewtonsoftJson | 109.41 ms | 0.977 ms | 0.913 ms | 4800.0000 | 2000.0000 | 600.0000 | 50.82 MB |
结语
可以看到性能确实会有影响,但是可以忽略不计了,100000条才差10ms。
同时可以发现System.Text.Json性能是Newtonsoft.Json的两倍
推荐大家以后在满足需求的情况下尽量使用内置的System.Text.Json
[.Net Core 3.0+/.Net 5] System.Text.Json中时间格式化的更多相关文章
- 在.Net Core 3.0中尝试新的System.Text.Json API
.NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...
- [译]试用新的System.Text.Json API
译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...
- 【译】System.Text.Json 的下一步是什么
.NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...
- .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json
微软终于追上了? 图片来自 Glenn Carstens-Peters Unsplash 欢迎来到.NET性能系列的另一章.这个系列的特点是对.NET世界中许多不同的主题进行研究.基准和比较.正如标题 ...
- 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...
- Net core 2.x 升级 3.0 使用自带 System.Text.Json 时区 踩坑经历
.Net Core 3.0 更新的东西很多,这里就不多做解释了,官方和博园大佬写得很详细 关于 Net Core 时区问题,在 2.1 版本的时候,因为用的是 Newtonsoft.Json,配置比较 ...
- .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法
行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...
- .NET Core 内置的 System.Text.Json 使用注意
System.Text.Json 是 .NET Core 3.0 新引入的高性能 json 解析.序列化.反序列化类库,武功高强,但毕竟初入江湖,炉火还没纯青,使用时需要注意,以下是我们在实现使用中遇 ...
- .netcore3.0 System.Text.Json 日期格式化
.netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...
随机推荐
- docker容器命令1
docker容器命令 新建并启动容器命令 docker run INAME(镜像名字) 语法:docker run [OPTIONS] INAME [COMMAND] 例子:docker run -i ...
- day28 Pyhton 面向对象 继承
1.昨日回顾 类的命名空间 静态属性\动态属性(方法) 对象的命名空间 #对象的属性 #类指针:对象能够通过这个类指针找到类 #静态属性:属于类,多个对象共享这个资源 #尽量用类名来操作静态属性 #对 ...
- 为了运行十年前的代码,程序员们甚至翻出了一台 1977 年的 Apple II
"Hello, World!" 46 年过去,这段被世人熟知的代码仍散发着历久弥新的魅力,和它一起登场的 C 语言,如今也成长为世界几大通行编程语言之一,为互联网世界乃至现实世界都 ...
- 【纯水题】CF 833A The Meaningless Game
题目大意 洛谷链接 现在两个人做游戏,每个人刚开始都是数字\(1\),谁赢了就能乘以\(k^2\),输的乘以\(k\),现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话输出Yes,否则输 ...
- net core 微服务 快速开发框架
dymDemo github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的 ...
- linux(centos8):用grep命令查找文件内容
一,grep的用途: linux平台有最常用的三大文本处理工具:awk/sed/grep grep的功能:搜索指定文件的内容,按照指定的模式匹配,并输出匹配内容所在的行. 需要注意的地方:grep只支 ...
- C# 微信共享收货地址 V1.6
//使用微信共享收货地址在跳转到当前页面的路径上必须要包含Code和state这两个获取用户信息的参数//例如 <a href="ProductOrder.aspx?OID=<% ...
- 5G-第五代移动通信系统(5th generation mobile/wireless/cellular system)
通信系统 有意义的信息交流被称为通讯. 自然界:狼嚎.狗叫.虫鸣.鸡叫. 人类社会:说话.眼神.写信.烽火台. 目的:信息的传递. 人类发明电以后,开始使用电来传递信息,特别快. 于是有了电报.电话以 ...
- js实现无缝连接轮播图(七)实现左侧按钮的功能
<!-- 这个animate.js 必须写到 index.js的上面引入 --><script src="js/animate.js"></scrip ...
- Java中<?>,<? extends E>,<? super E>
在集合中,经常可看到<?>,<? extends E>,<? super E>,它们都是属于泛型: <?>: 是泛型通配符,任意类型,如果没有明确,那么 ...