如何在Jil Options中指定含固定三位毫秒的DateTime序列化格式?
Jil序列化DateTime强制保留三位毫秒的解决方案
问题场景
API要求序列化DateTime时必须保留完整三位毫秒(即使末尾为零)。例如:
- 原时间戳
2022-04-29 15:19:41.300,预期序列化结果为2022-04-29T22:19:41.300Z - 使用Newtonsoft通过自定义
IsoDateTimeConverter已解决该问题,但切换到Jil处理大对象序列化时,Jil会自动截断毫秒末尾的零,输出2022-04-29T22:19:41.3Z,不符合要求。
已实现的Newtonsoft修复代码
public static void ServiceJsonSettings(HttpConfiguration config, IServiceMetadata serviceMetadata) { config.Formatters.Insert(0, new JsonNewtonsoftJilFallbackFormatter()); IsoDateTimeConverter dateConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'", DateTimeStyles = DateTimeStyles.AdjustToUniversal }; config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(dateConverter); }
当前Jil序列化配置
public static readonly Options JilOptions = new Options(excludeNulls: true, includeInherited: true, serializationNameFormat: SerializationNameFormat.CamelCase, dateFormat: DateTimeFormat.ISO8601);
核心疑问
是否可以在Jil的Options中直接指定自定义日期格式"yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z"?
解决方案
Jil的Options类不支持直接传入自定义日期格式字符串,其dateFormat参数仅接受内置的DateTimeFormat枚举值。要实现强制保留三位毫秒的需求,可通过以下两种方式:
方案1:全局注册自定义日期格式化器
实现IFormatter<DateTime>接口替换默认序列化逻辑,确保输出固定三位毫秒:
public class FixedMillisecondDateTimeFormatter : IFormatter<DateTime> { public void Serialize(DateTime value, TextWriter writer, Options options) { var utcValue = value.ToUniversalTime(); writer.Write($"\"{utcValue:yyyy-MM-dd'T'HH:mm:ss.fffZ}\""); } public DateTime Deserialize(TextReader reader, Options options) { var dateStr = reader.ReadToEnd().Trim('"'); return DateTime.Parse(dateStr, options.Culture, DateTimeStyles.AdjustToUniversal); } }
注册到Jil配置中:
public static readonly Options JilOptions = new Options( excludeNulls: true, includeInherited: true, serializationNameFormat: SerializationNameFormat.CamelCase, dateFormat: DateTimeFormat.ISO8601) .RegisterFormatter(new FixedMillisecondDateTimeFormatter());
方案2:局部字段自定义序列化
如果仅需针对特定字段处理,可在序列化时手动格式化DateTime值:
var targetObj = new { EventTime = yourDateTime.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fffZ"), // 其他字段... }; var json = JSON.Serialize(targetObj, JilOptions);
内容的提问来源于stack exchange,提问作者Shani Bhati
相关产品推荐
相关产品推荐

