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