You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:57:34