.NET Framework与.NET 6 Web API中DateTime返回格式差异及兼容问询
让.NET 6 Web API兼容.NET Framework DateTime序列化行为
问题背景
你的场景中,.NET Framework 4.7.2会将Kind=Unspecified的DateTime序列化为带Z后缀的UTC格式,而.NET 6默认仅输出时间字符串不带时区标识,导致客户端显示异常。要让.NET 6对齐旧版本行为,可通过自定义Json转换器实现。
全局配置方案(推荐)
在Program.cs中配置控制器的Json序列化选项,添加自定义转换器:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new UnspecifiedDateTimeToUtcConverter()); }); // 自定义DateTime序列化转换器 public class UnspecifiedDateTimeToUtcConverter : JsonConverter<DateTime> { public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化保持默认逻辑,如需特殊处理可修改 return DateTime.Parse(reader.GetString()!); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { if (value.Kind == DateTimeKind.Unspecified) { // 将未指定时区的DateTime按UTC格式输出,带Z后缀 writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")); } else { // 其他时区类型保持默认序列化 writer.WriteStringValue(value); } } }
局部配置方案
如果仅需针对特定属性调整,可在属性上标注自定义转换器:
public class DateResponse { [JsonConverter(typeof(UnspecifiedDateTimeToUtcConverter))] public DateTime MyDate { get; set; } }
效果验证
配置完成后,你的示例接口返回结果将变为:
2023-09-26T12:28:20.793Z
与.NET Framework的输出完全一致,解决客户端显示问题。
内容的提问来源于stack exchange,提问作者Abhiram M
相关产品推荐
相关产品推荐

