序言
默认情况下,JSON序列化程序通过IsoDateTimeConverter
通过一些额外的自定义,我们可以强制所有日期时间都是UTC(http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization)
jsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
这会再次按预期运行,1972-09-18T02:29:12.264513Z
和1972-09-18T04:29:12.264513+02:00
在序列化后都等同于1972-09-18 02:29:12 AM
。
问题
不幸的是,不考虑时区偏移后缀也成功序列化。因此1972-09-18T04:29:12.264513
等同于1972-09-18 04:29:12 AM
UTC。
这里的问题是我们假设消费者知道日期格式并且理解(根据我们的文档)日期总是假定为UTC。
问题
如果缺少时区偏移后缀,有没有办法强制序列化失败,以便我们不做任何假设?
答案 0 :(得分:2)
我只是查看了Json.NET代码,我担心这是不可能的(或者至少极其困难,因为需要覆盖JsonTextReader
/ JsonTextWriter
)才能失败如果省略时区偏移后缀。与解析和序列化各种数据类型相关的所有代码都是内部的。
下面是魔术正在变化的地方的链接:
答案 1 :(得分:1)
看看规格。不表示时区偏移的日期时间应假定为当地时间:
如果没有给出时间表示的UTC关系信息, 假设时间是在当地时间。虽然它可能是安全的 假设在同一时区进行通信时的本地时间 用于跨不同时区进行通信时不明确。它 通常优选表示使用时区(区域指示符) 标准的表示法。 - Wikipedia
因此,最好坚持商定的标准。因此,严格执行标准意味着我应该允许暂停时区偏移。
答案 2 :(得分:0)
这个问题的标题应该说"严格执行RFC 3339日期时间......"
那是因为ISO 8601实际上是doesn't require Time zone designator in the value。需要它的格式是RFC 3339 date-time。 RFC 3339是ISO8601格式的子集,也是在Internet上广泛使用的格式(JSON Schema,OpenAPI)。
至于Newtonsoft JSON库的解决方案(以及因此ASP.NET和现在使用它的许多框架),我已经提出了this issue以使其成为可能,但是现在只有一个{{3} }。