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
相关产品推荐
相关产品推荐

