JSON响应模型中的时间?

时间:2014-03-05 06:12:54

标签: asp.net-mvc json asp.net-web-api json.net iso8601

我正在使用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

1 个答案:

答案 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。错误的工具。