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

问题描述

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

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

执行此操作时:

JsonSerializer.Deserialize<T>(jsonString);

我得到的时间跨度为 0?

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

问候

解决方法

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

您有两个选择:

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

  2. 编写一个自定义 JsonConverter,用于序列化 TicksTimeSpan 属性。需要设置更多代码,但您可以直接在类中使用 TimeSpan

,

System.Text.Json.Deserialize 不会处理 Core 5 中的 TimeSpan,由于我的环境,现在最好只恢复到 Newtonsofts 版本。但据我了解,.NET 版本要快得多,因此只要它能够正确处理类型,就可能值得迁移。