Разбор utctime с 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

Экземпляр FromJSON типа UTCTime следующий (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"

после описания формата, найденного здесь, все должно быть в порядке. Что мне не хватает?

Ответ 1

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

Обратите внимание на раздел "ловушки" в пикшах:

Обратите внимание, что стандарт JSON требует, чтобы значение верхнего уровня либо массив, либо объект. Если вы попытаетесь использовать декодирование с результатом тип, который не представлен в JSON как массив или объект, ваш код будет typecheck, но он всегда будет "сбой" во время выполнения:

...

Поэтому придерживайтесь объектов (например, карт в Haskell) или массивов (списки или векторы в Haskell):