问题描述
我有以下从 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*
值),并且在开始时存储无用信息。
您有两个选择:
-
序列化和反序列化
Ticks
属性。这足以以跨平台的方式构建TimeSpan
。不要使用Total*
属性,因为它们会因分辨率而丢失信息,Ticks
是一个原始的 64 位整数,它完全表示 .Net 规范给TimeSpan
类型的分辨率,并且不会改变。 -
编写一个自定义 JsonConverter,用于序列化
Ticks
的TimeSpan
属性。需要设置更多代码,但您可以直接在类中使用TimeSpan
。
System.Text.Json.Deserialize 不会处理 Core 5 中的 TimeSpan,由于我的环境,现在最好只恢复到 Newtonsofts 版本。但据我了解,.NET 版本要快得多,因此只要它能够正确处理类型,就可能值得迁移。