.NET Core 3.1中使用NewtonsoftJson遇到DateTime转换失败及必填字段错误的替代配置方案咨询
解决.NET Core 3.1中NewtonsoftJson的两个序列化问题
嘿,我来帮你搞定这两个问题,直接通过AddNewtonsoftJson的配置就能一次性解决,不用改实体类也能行:
错误1:字符串毫秒时间戳转DateTime失败
默认情况下,NewtonsoftJson不会自动把字符串格式的毫秒级Unix时间戳转成DateTime。咱们可以加个自定义转换器来精准处理这种场景,配置起来很简单:
错误2:必填字段缺失报错
你碰到的The Item field is required错误,要么是请求里多了实体类没有的Item字段,要么是实体类里的qty(值类型int)没传值触发了必填校验。咱们通过配置就能解决这两种情况。
完整配置代码
直接把这段配置放到Startup的ConfigureServices里(如果是.NET Core 3.1项目,大部分用的是Startup类):
services.AddControllers() .AddNewtonsoftJson(options => { // 解决时间戳转DateTime:添加自定义转换器 options.SerializerSettings.Converters.Add(new UnixDateTimeConverter()); // 解决必填/多余字段问题:忽略不存在的字段,给缺失属性填默认值 options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore; options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Populate; // 可选:如果需要统一DateTime的输出格式,加这行 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; });
自定义UnixDateTimeConverter实现
这个转换器专门处理字符串类型的毫秒级时间戳,复制到项目里就行:
public class UnixDateTimeConverter : JsonConverter<DateTime> { public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer) { // 先尝试把字符串转成毫秒时间戳 if (reader.Value is string timestampStr && long.TryParse(timestampStr, out var timestamp)) { return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).DateTime; } // 转失败就用默认解析逻辑 return serializer.Deserialize<DateTime>(reader); } public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer) { // 如果需要把DateTime输出成毫秒时间戳,就用这行;否则注释掉用默认格式 writer.WriteValue(new DateTimeOffset(value).ToUnixTimeMilliseconds()); } }
配置说明
- 时间戳转换:自定义转换器会优先解析字符串格式的毫秒时间戳,同时兼容正常的日期字符串,不会影响其他场景。
- 必填字段问题:
MissingMemberHandling.Ignore:告诉Newtonsoft忽略请求中实体类没有的字段(比如你提到的Item字段),不会因为多余字段报错。DefaultValueHandling.Populate:给实体类中缺失的属性填充默认值(比如int类型的qty会填0),这样就不会触发必填校验的错误了。
如果你觉得qty确实是可选字段,也可以把它改成int?(可空值类型),但用配置的方式不需要修改实体类,更适合已有代码的场景。
这样配置完,你的两个问题就都解决啦!
内容的提问来源于stack exchange,提问作者EvaHHHH
相关产品推荐
相关产品推荐

