【问题标题】:Time of Day in the JSON response model?JSON响应模型中的时间?
【发布时间】:2014-03-05 06:12:53
【问题描述】:
我正在使用带有 Json.NET 6.0.1 的 ASP.NET Web Api 2。
根据ISO 8601,日期应该以某种方式互换。我正在使用IsoDateTimeConverter() 来实现这一点:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter());
但是如何在 JSON 响应模型中返回“一天中的时间”?
我在 ISO 规范中找不到任何相关内容。
应该将时间返回为:
-
TimeSpan? (期望用户不要将其用作持续时间表示)
-
DateTime? (期望用户放弃日期部分)
- 自定义
Time 类
【问题讨论】:
标签:
asp.net-mvc
json
asp.net-web-api
json.net
iso8601
【解决方案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。错误的工作工具。