System.Text.Json.Deserialize 仍然无法处理 .NET Core 5 中的 TimeSpan?

System.Text.Json.Deserialize can still not handle TimeSpan in .NET Core 5?

我从 JsonSerilizer.Serialize<TimeSpan>(MyTymeSpan) 生成了以下 TimeSpan JSON 字符串; :

jsonString= {"Ticks":1770400500000,"Days":2,"Hours":1,"Milliseconds":50,"Minutes":10,"Seconds":40,"TotalDays":2.0490746527777777,"TotalHours":49.177791666666664,"TotalMilliseconds":177040050,"TotalMinutes":2950.6675,"TotalSeconds":177040.05}

执行此操作时:

JsonSerializer.Deserialize<T>(jsonString);

我得到的 TimeSpan 是 0?

一些文章说这应该在 .NET Core 5 中修复,为什么我得到 0?

此致

不,不是开箱即用的。事实上,你在序列化时遇到的混乱被破坏了,因为它多次存储相同的值(Total* 值),并且在开头存储无用的信息。

您有两个选择:

  1. 序列化和反序列化 Ticks 属性。这足以以跨平台的方式构建 TimeSpan。不要使用 Total* 属性,因为它们会因分辨率而丢失信息,Ticks 是一个原始的 64 位整数,它完全表示 .Net 规范为 TimeSpan 类型提供的分辨率,并且不会改变。

  2. 编写自定义 JsonConverter,为 TimeSpan 序列化 Ticks 属性。需要设置更多代码,但是您可以直接在 class.

    中使用 TimeSpan

System.Text.Json.Deserialize 不会处理 Core 5 中的 TimeSpan,并且由于我的环境,最好暂时恢复到 Newtonsofts 版本。但据我所知,.NET 版本要快得多,所以只要它能够正确处理类型,就值得迁移。