简介

.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:18ISO 8601-1:2019标准参考:ISO官网 | 百度百科 | wikipedia

但我们一般用的时候不想要这种格式,因为中间有一个T,前端处理起来很麻烦,最好还是返回指定的时间格式,例如:yyyy-MM-ddyyyy-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"));
}
}

使用

代码看起来非常简单是不是,只需要重写ReadWrite,但是我们只是写了一个自定义转换器,怎么让它生效呢,请往下看:

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中时间格式化的更多相关文章

  1. 在.Net Core 3.0中尝试新的System.Text.Json API

    .NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...

  2. [译]试用新的System.Text.Json API

    译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...

  3. 【译】System.Text.Json 的下一步是什么

    .NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...

  4. .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

    微软终于追上了? 图片来自 Glenn Carstens-Peters Unsplash 欢迎来到.NET性能系列的另一章.这个系列的特点是对.NET世界中许多不同的主题进行研究.基准和比较.正如标题 ...

  5. 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

    前言 以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newt ...

  6. Net core 2.x 升级 3.0 使用自带 System.Text.Json 时区 踩坑经历

    .Net Core 3.0 更新的东西很多,这里就不多做解释了,官方和博园大佬写得很详细 关于 Net Core 时区问题,在 2.1 版本的时候,因为用的是 Newtonsoft.Json,配置比较 ...

  7. .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法

    行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...

  8. .NET Core 内置的 System.Text.Json 使用注意

    System.Text.Json 是 .NET Core 3.0 新引入的高性能 json 解析.序列化.反序列化类库,武功高强,但毕竟初入江湖,炉火还没纯青,使用时需要注意,以下是我们在实现使用中遇 ...

  9. .netcore3.0 System.Text.Json 日期格式化

    .netcore3.0 的json格式化不再默认使用Newtonsoft.Json,而是使用自带的System.Text.Json来处理. 理由是System.Text.Json 依赖更少,效率更高. ...

随机推荐

  1. for循环迭代可迭代对象

    模仿for循环迭代可迭代对象,# for i in Iterable:# iterable >>> 迭代器.iterator# 可迭代对象 iterable# 迭代器.iterato ...

  2. angularCroppie

    下载 angularCroppieangularCroppie 图像Cropper使用Croppie 安装 Npm: Npm安装角croppie 使用 添加依赖项:angular.模块("m ...

  3. ZooKeeper伪分布式集群安装及使用

    ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越 ...

  4. 如何将python下载源地址修改为国内镜像源

    (1)在  C:\Users\xxx 下面创建新的目录  pip 文件夹 (2)在 pip目录下创建后缀为ini,名为pip的文件,另存为  (pip.ini) 文件内容设置为:(清华源) [glob ...

  5. day64 Pyhton 框架Django 07

    day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): sel ...

  6. golang 爬取百度贴吧绝地求生页面

    package main import ( "github.com/antchfx/htmlquery" "io" "net/http" & ...

  7. canal快速启动

    QuickStart  https://github.com/alibaba/canal/wiki/QuickStart        准备 对于自建 MySQL , 需要先开启 Binlog 写入功 ...

  8. 抽空学学KVM(六)qemu-img命令使用

    通过KVM创建虚拟机,用到的命令不多,而且可以通过qemu-img -help查看到非常详细的解释,常用的主要有以下几种: 1.qemu-img info  查看磁盘信息     #info [-f ...

  9. BMP位图调色板说明

    网上一搜,可以看到BMP位图结构的详细说明,这篇文章专门谈一下其中的调色板. 多少位位图并不是指每一个颜色该用多少位表示,对于颜色来说,它始终都是24位(RGB),或者是32位(RGBA),而是指该位 ...

  10. wait/sleep的区别

    相同: 暂停线程,哪里停哪里开始 不同: wait      释放锁等待 sleep    不释放锁等待 wait .notfy. notfyAll 都是属于Object sleep 属于Thread