用aeson解析utctime

Sim*_*got 11 haskell aeson

我无法让aeson解析UTCTime值.我试图对其进行编码并将其反馈,但这不起作用:

Prelude Data.Aeson Data.Time.Clock> getCurrentTime >>= (print . encode)
"\"2013-10-17T09:42:49.007Z\""
Prelude Data.Aeson Data.Time.Clock> decode "2013-10-17T09:42:49.007Z" :: Maybe UTCTime
Nothing
Prelude Data.Aeson Data.Time.Clock> decode "\"2013-10-17T09:42:49.007Z\"" :: Maybe UTCTime
Nothing
Run Code Online (Sandbox Code Playgroud)

UTCTime类型的FromJSON实例是以下(ref):

instance FromJSON UTCTime where
    parseJSON = withText "UTCTime" $ \t ->
        case parseTime defaultTimeLocale "%FT%T%QZ" (unpack t) of
          Just d -> pure d
          _      -> fail "could not parse ISO-8601 date"
Run Code Online (Sandbox Code Playgroud)

按照此处的格式说明,一切都应该没问题.我错过了什么?

Tho*_*son 17

Prelude Data.Aeson Data.Time> decode (encode [x]) :: Maybe [UTCTime]
Just [2013-10-17 10:06:59.542 UTC]
Run Code Online (Sandbox Code Playgroud)

注意黑线鳕的"陷阱"部分:

请注意,JSON标准要求顶级值是数组或对象.如果您尝试将具有未在JSON中表示的结果类型的解码用作数组或对象,则您的代码将进行类型检查,但在运行时它将始终"失败":

...

因此坚持使用对象(例如Haskell中的映射)或数组(Haskell中的列表或向量):

  • 如果你使用`Data.Aeson.Parser`中的`value`解析器,你可以覆盖规范.只需要解析顶级json对象/数组,并解析各个值.与attoparsec一起使用. (2认同)