无法将字符串转换为 TimeSpan

Cannot convert string to TimeSpan

因此,我正在创建一项服务(使用 ASP.NETCore 3.1),该服务接收有关可在系统中注册的商店的运营计划的信息。为此,我有一个与数据库通信的实体和一个与该实体通信的模型,如下所示:

实体:

public class OperationSchedule
    {
        public int Id { get; set; }
        public TimeSpan Open { get; set; }
        public TimeSpan Close { get; set; }
        public DayOfWeek DatofWeek { get; set; }
    }

型号:

public class OperationScheduleModel
    {
        public TimeSpan Open { get; set; }
        public TimeSpan Close { get; set; }
        public DayOfWeek DatofWeek { get; set; }
    }

当然,它们已经使用自动映射器进行了映射。我正在使用 swagger 来测试此类通信。当我尝试 post 一个新的“操作计划”时,问题就开始了,swagger 向我显示了以下输出:

将值“字符串”转换为类型 'System.TimeSpan'

时出错

在我第一次尝试解决这个问题时,我尝试使用 Microsoft.AspNetCore.Mvc.NewtonsoftJson,并在启动时以这种方式配置它:services.AddMvc().AddNewtonsoftJson();

只要它没有解决我的问题,我就在考虑通过执行以下操作在 Automapper 上映射类型字符串和 TimeSpan:

public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {            
            // Custom types mapping
            CreateMap<string, TimeSpan>.ConvertUsing<StringToTimeSpanConverter>();

            // OperationSchedule mapping
            CreateMap<OperationSchedule, OperationScheduleModel>();
            CreateMap<OperationScheduleModel, OperationSchedule>();
        }
    }

但是 VisualStudio 不允许我这样做,说不能将“StringToTimeSpanConverter”用作通用 属性,像 ConvertUsing(new StringToTimeSpanConverter()); 这样的东西没有任何区别。 我真的无法想象解决它的另一种方法,但我可能会遗漏一些东西吗?请帮忙

Error converting value "string" to type 'System.TimeSpan'

原因是 System.Text.Json 不支持 TimeSpan。

一种解决方案是返回 JSON.NET。以下是步骤:

添加对 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的包引用。

更新 Startup.ConfigureServices 以调用 AddNewtonsoftJson

services.AddControllers()
        .AddNewtonsoftJson();

另一种选择是为该 TimeSpan 使用自定义转换器:

public class CustomConverter : JsonConverter<TimeSpan>
{
    public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var value = reader.GetString();
        return TimeSpan.Parse(value);
    }

    public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

Startup.ConfigureServices 中注册 AddJsonOptions:

services.AddControllers()
        .AddJsonOptions(options =>
             options.JsonSerializerOptions.Converters.Add(new CustomConverter())
);

结果: