强制JSON.NET在序列化DateTime时包含毫秒(即使ms组件为零)

Ale*_*lex 30 c# serialization datetime json json.net

我正在使用JSON.NET直接从对象实例序列化DateTime值(不使用带格式化程序的DateTime.ToString()).

有没有办法强制JSON.NET在序列化中包含毫秒,即使DateTime的毫秒组件为零?

背景:对于这个JSON端点,我有一个非常慢的Web服务使用者.条件逻辑对于消费者来说是昂贵的,因此我希望每次都提供相同的数据格式.

Bri*_*ers 44

我们在当前项目中遇到了同样的问题.我们使用Web API(以及JSON.Net)来实现REST API.我们发现,在序列化DateTime对象时,JSON.Net会从毫秒中省略尾随零,或者如果它为零则省略完全从日期开始的毫秒数.我们的客户期望一个固定长度的日期时间字符串,精确到3位数毫秒.我们通过以下方式修复它Application_Start():

JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings;
IsoDateTimeConverter dateConverter = new IsoDateTimeConverter 
{ 
    DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" 
};
settings.Converters.Add(dateConverter);
Run Code Online (Sandbox Code Playgroud)

如果你没有使用Web API,你可以通过创建一个新的实例来做同样的事情,如上所示JsonSerializerSettings添加IsoDateTimeConverter它,然后将序列化设置设置传递给JsonConvert.SerializeObject().

注意:如果您要序列化一个DateTimeOffset或一个本地,DateTime并且想要包含时区偏移量,请将'Z'上述格式中的引用替换为不带引号K.有关详细信息,请参阅文档中的自定义日期和时间格式字符串.

  • @jrummel:即使在这种情况下,字面分隔符也很重要.例如,如果您当前的文化是*"it-IT"*那么您的时间部分将被转换为类似*"12.31.42"*,如果您没有通过引用将*":"*分隔符视为文字它. (4认同)
  • 我的回答只是试图解决OP的问题,即如何让JSON.Net始终包含格式化日期时的毫秒数.它没有提出任何形式的性能声明. (3认同)
  • @jrummell单引号表示格式中文字字符的开头和结尾,即那些不打算用日期的一部分替换的字符.在这里,它并不重要,因为没有任何文字字符`-`,`T`,`:`和`Z`可以与格式说明符字符混淆.另一方面,如果你想把文字`M`放在某个地方,你肯定需要引用它.有关详细信息,请参阅文档中的[自定义日期和时间格式字符串](https://msdn.microsoft.com/en-us/library/8kb3ddd4(v = vs.110).aspx). (3认同)