Разбор 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):