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

C# 如何让DataContractJsonSerializer兼容带毫秒的DateTime反序列化

解决方案

方案1:修改序列化配置(改动最小)

直接调整DataContractJsonSerializerSettings中的DateTimeFormat格式字符串,使用支持可选毫秒的ISO格式即可同时兼容新旧两种时间格式:

DataContractJsonSerializerSettings dataContractJsonSerializerSettings =
new DataContractJsonSerializerSettings
{
    IgnoreExtensionDataObject = false,
    MaxItemsInObjectGraph = int.MaxValue,
    EmitTypeInformation = EmitTypeInformation.Never,
    // 替换原来的"s"格式,FFFFFFF会自动匹配0-7位毫秒,兼容带/不带毫秒的时间
    DateTimeFormat = new DateTimeFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK") { DateTimeStyles = DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowWhiteSpaces }
};

该方案不需要修改数据契约定义,对原有旧格式的解析逻辑完全无影响,仅需修改序列化器配置即可生效。

方案2:自定义字段解析(兼容性最强)

如果后续还有其他时间格式需要兼容,可以通过字符串中转属性自定义解析逻辑,灵活适配多格式:

[DataContract]
private class TestObject
{
    // 标记原DateTime字段不参与序列化/反序列化
    [IgnoreDataMember]
    public DateTime date { get; set; }

    // 支持的所有时间格式,可按需扩展
    private static readonly string[] _supportedDateTimeFormats = new[] 
    { 
        "s", 
        "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK" 
    };

    [DataMember(Name = "date")]
    public string DateRawValue
    {
        get => date.ToString("s");
        set
        {
            if (DateTime.TryParseExact(value, _supportedDateTimeFormats, CultureInfo.InvariantCulture, 
                DateTimeStyles.AssumeUniversal | DateTimeStyles.AllowWhiteSpaces, out var parsedDate))
            {
                date = parsedDate;
                return;
            }
            // 可按需自定义异常处理逻辑,比如赋默认时间
            throw new SerializationException($"无效的时间格式:{value}");
        }
    }
}

该方案支持任意自定义格式扩展,还可以额外增加异常兜底逻辑,适合格式复杂度较高的场景。


内容的提问来源于stack exchange,提问作者ROODAY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:27:00