c# - 无法将字符串转换为 TimeSpan

标签 c# asp.net-core asp.net-core-mvc automapper

因此,我正在创建一个服务(使用 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 来测试此类通信。当我尝试发布新的“操作计划”时,问题就开始了,swagger 显示了以下输出:

将值“string”转换为类型“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 不允许我这样做,说 a 不能使用“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());
    }
}

使用AddJsonOptionsStartup.ConfigureServices中注册它:

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

结果: enter image description here

关于c# - 无法将字符串转换为 TimeSpan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63585475/

相关文章:

c# - 在 ASP.NET 5 中注册应用程序事件的处理程序

asp.net-core - 在不影响数据的情况下更改模型属性的数据类型

asp.net-mvc - MVC Core 表单标签帮助器继承当前 View URL 的操作属性

c# - Razor Pages中如何处理input=file/IFormFile双向绑定(bind)

c# - 在 ASP.NET Core MVC 1.0.1 (ASP.NET Core 1.1) 中覆盖 Controller / Action 中的全局 Action 过滤器

c# - 缺少系统.Windows

c# - 在 AutoFixture 自定义上调用 Dispose 方法

c# - XOR 运算符 - 它是如何工作的?

c# - 返回 IQueryable 时覆盖 DbContext

ASP.NET Core 策略库使用 RequireUser 和字符串数组进行授权