14

在研究如何TimeSpan使用 Newtonsoft 的 JSON.net 反序列化时,我在当前项目中遇到了不使用 Json.net 的代码。根据我正在运行的单元测试,它在反序列化属性的操作上使用System.Text.Json.JsonSerializer并且似乎没有失败。TimeSpan

太好了,我想,.Net Core 3.1已经超越了反序列化 a 的历史问题,TimeSpan一切都很好。因此,在最新版本的 Linqpad 6(使用 .NET Core)中启动了一个测试用例来验证,令我懊恼的是它失败了。


所以问题是,是否可以TimeSpan使用任何一个库进行序列化/反序列化(如果可以的话)......或者我的测试用例在某些方面是否存在缺陷?


代码

public class Project { public TimeSpan AverageScanTime { get; set; } }

Linqpad C# 代码

var newP = new Project() { AverageScanTime = TimeSpan.FromHours(1) };

newP.Dump("New one");

var json = System.Text.Json.JsonSerializer.Serialize(newP);

json.Dump("JSON serialized");

System.Text.Json.JsonSerializer.Deserialize<Project>(json)
                               .Dump("JSON Deserialize");

反序列化失败

在此处输入图像描述

4

2 回答 2

21

TimeSpan 的 JsonSerializer 似乎将在Future中添加(从 .NET 6 里程碑中删除)。您可以在未来里程碑或此问题中跟踪此问题

这时候可以自己实现JsonTimeSpanConverter。或者您可以安装Macross.Json.Extensions nuget 包并按照说明进行 de/serializer。

于 2020-02-04T14:48:27.883 回答
3

Poy Chang 回答的补充

Swagger (Swashbuckle) 也需要配置

services.AddSwaggerGen(options =>
{
    options.MapType(typeof(TimeSpan), () => new OpenApiSchema
    {
        Type = "string",
        Example = new OpenApiString("00:00:00")
    });
});
于 2021-07-22T09:38:52.827 回答