无法将字符串转换为 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())
);
结果:
因此,我正在创建一项服务(使用 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())
);
结果: