[.Net Core 3.0+/.Net 5] System.Text.Json中時間格式化

簡介

.Net Core 3.0開始全新推出了一個名爲System.Text.Json的Json解析庫,用於序列化和反序列化Json,此庫的設計是爲了取代Json.Net(Newtonsoft.Json)html

時間格式化的不足

System.Text.Json的優勢就不說了,來講一下不完善的地方,畢竟一個新事物出來,不可能十全十美的,用的最多的就是時間的格式化前端

官方文檔:在 System.Text.Json 中,具備內置支持的惟一格式是 ISO 8601-1:2019,由於它被普遍採用、意義明確而且可精確地進行往返。 若要使用任何其餘格式,請建立自定義轉換器json

ISO 8601-1:2019通俗的說就是時間格式化爲2020-11-11T21:08:18ISO 8601-1:2019標準參考:ISO官網 | 百度百科 | wikipediaide

但咱們通常用的時候不想要這種格式,由於中間有一個T,前端處理起來很麻煩,最好仍是返回指定的時間格式,例如:yyyy-MM-ddyyyy-MM-dd HH:mm:ss性能

解決方案

既然官方不內置提供指定時間格式化的方式,那就沒辦法了嗎,查閱文檔發現,雖然沒法簡單的實現功能,可是能夠經過建立自定義轉換器來實現相應功能測試

文檔地址:微軟官方文檔設計

如下是一個自定義時間轉化器的完整實現:code

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,可是咱們只是寫了一個自定義轉換器,怎麼讓它生效呢,請往下看:orm

JsonSerializer.Serialize()JsonSerializer.Deserialize()方法都接受一個JsonSerializerOptions類型的配置項參數htm

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

相關文章
相關標籤/搜索