我正在使用ASP.NET Web Api 2和Json.NET 6.0.1。
根据ISO 8601,日期应以某种方式互换。我正在使用IsoDateTimeConverter()
来实现这一目标:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter());
但是如何在JSON响应模型中返回“时间”?
我在ISO规范中找不到任何相关内容。
是否应将时间作为:
返回TimeSpan
? (期望用户不要将其用作持续时间表示)DateTime
? (期望用户放弃日期部分)Time
类答案 0 :(得分:1)
JSON中没有用于包含日期或时间的标准结构(请参阅JSON.org)。正如您所提到的,日期时间值的事实标准是使用ISO 8601格式的字符串。但是,由于没有官方标准,它实际上归结为最适合您和API的消费者。
使用DateTime
对象是一个合理的选择,因为Json.Net和其他序列化程序中已存在支持,用于将这些对象与ISO 8601字符串进行转换。所以这将是最容易实现的。但是,正如您所说,您的API用户必须知道忽略日期部分。您可以将日期设置为0001-01-01以强调其不相关性。这与您只需要API中的日期并且时间无关紧要的更常见情况没有太大区别。在这种情况下,大多数人只是将时间设置为午夜,然后放手。但是,我同意这种方法似乎对它有一点“代码味道”,因为部分值只是噪音。
或许更清晰的想法是将您的DateTime
值格式化为ISO 8601,但在返回之前切掉日期部分。因此,API的用户将获得类似14:35:28.906Z
的字符串。在序列化期间,您可以编写一个简单的JsonConverter
来为您处理此问题。这将为您提供两全其美 - 一个更干净的API,但您仍然可以在内部使用熟悉的DateTime
结构。
自定义Time
类也可以在这里工作,但可能有点过分,具体取决于。如果你确实需要去那里,你可能想要查看第三方库,例如Noda Time,它已经为这些类型的东西构建了类,并且还为Json.Net提供了预构建的转换器。
我绝对不会为此选择TimeSpan
。错误的工具。