因此,我正在创建一个服务(使用 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());
}
}
使用AddJsonOptions
在Startup.ConfigureServices
中注册它:
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new CustomConverter())
);
关于c# - 无法将字符串转换为 TimeSpan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63585475/