ASP.NET Core Web API中DateTime无法解析特定UTC时间格式问题
解决ASP.NET Core Web API解析非标准DateTime格式JSON的问题
在ASP.NET Core Web API项目接收Java API的Webhook请求时,JSON中time、insertTime字段的格式为"2023-03-01T11:12:00+0000",无法被默认的System.Text.Json解析为DateTime?类型,触发转换错误。
核心原因
System.Text.Json默认仅严格遵循ISO 8601标准格式(时区偏移需带冒号,如+00:00),而Java API返回的+0000属于非标准格式,因此解析失败。
解决方案
方法一:为DateTime字段添加自定义Json转换器
自定义支持目标格式的转换器,标注在对应字段上:
- 编写自定义转换器类
public class CustomDateTimeConverter : JsonConverter<DateTime?> { private const string TargetFormat = "yyyy-MM-dd'T'HH:mm:sszzzz"; public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String && DateTime.TryParseExact(reader.GetString(), TargetFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result)) { return result; } return null; } public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options) { writer.WriteStringValue(value?.ToString(TargetFormat, CultureInfo.InvariantCulture)); } }
- 修改实体类字段,添加转换器特性
public class Data { // 其他字段保持不变... [JsonPropertyName("time")] [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime? time { get; set; } [JsonPropertyName("insertTime")] [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime? insertTime { get; set; } // 其他字段保持不变... }
方法二:全局配置Json序列化选项
如果希望整个API都支持该格式,在Program.cs中全局配置:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new CustomDateTimeConverter()); }); // 其他项目配置... var app = builder.Build(); // 中间件配置... app.Run();
方法三:替换为Newtonsoft.Json(Json.NET)
Json.NET默认支持更多DateTime格式,包括不带冒号的时区偏移:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Program.cs中配置使用Json.NET:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 可选:指定统一输出格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd'T'HH:mm:sszzzz"; });
替换后原实体类无需修改,即可直接解析目标JSON格式。
内容的提问来源于stack exchange,提问作者BoeykensBrooklyn
相关产品推荐
相关产品推荐

