我有一个带有 DateTime 属性的 DTO。当我使用 Swagger 将数据发送到端点时,它需要特定格式的日期时间。
public class TimeStampDTO
{
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}", ApplyFormatInEditMode = true)]
[DataType(DataType.DateTime)]
public DateTime Timestamp { get; set; }
}
当我检查 swagger 时,它需要一个与 DTO 中指定的格式不同的日期时间。
{
"timestamp": "2024-09-27T09:31:42.291Z"
}
预期结果:
{
"timestamp": "2024-09-27 09:31:42"
}
我现在无法接近端点,因为我无法序列化时间戳。我该如何解决这个问题?
有两种方法可以做到这一点:
使用Newtonsoft.Json: 安装包:
dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson
在 Startup.cs(或 .NET 5+ 的 Program.cs)中,配置 JSON 序列化器:
services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});
或者 使用 System.Text.Json:
在 Startup.cs(或 .NET 5+ 的 Program.cs)中:
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
创建自定义日期时间转换器:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
DateTime.ParseExact(reader.GetString(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) =>
writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
}
这将确保 Swagger 和您的 API 都使用所需的日期时间格式。