2013-10-17 12 views
11

Nie mogę uzyskać eseonu do przeanalizowania wartości UTCTime. Próbowałem kodować jeden i karmić je z powrotem, ale to nie działa:parsowanie utctime z aesonem

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 

Instancja FromJSON typu UTCTime jest następujący (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" 

następujący opis formatu znalezionego here, wszystko powinno być w porządku. czego mi brakuje?

Odpowiedz

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

Uwaga rozdział „pułapek” w haddocks:

Należy zauważyć, że średnia JSON wymaga wartość najwyższego poziomu być tablicą lub obiektem. Jeśli spróbujesz użyć dekodować z wynikiem typu, które nie są reprezentowane w JSON jako tablica lub obiekt, Twój kod będzie typecheck, ale zawsze „nie” przy starcie:

...

Tak trzymać się obiektów (np mapy w Haskell) lub tablic (list lub wektorów w Haskell):

+0

czytałem ten rozdział. Jednak mój mózg nie nawiązał połączenia. Dzięki! – Simon

+0

Jedną z praktycznych sztuczek, które można ominąć, jest po prostu umieszczenie twoich typów w warstwie listy: 'decode" ... ":: FromJSON a => Maybe [a]'. Używam go cały czas do sprawdzania przekleństw. Jest to * znacznie * łatwiejsze niż próby przeprogramowania wewnętrznych analizatorów Aeson, aby uzyskać niestandardowe zachowanie JSON. –

+2

Jeśli użyjesz parsera 'value' z' Data.Aeson.Parser', możesz zmienić specyfikację. wymaganie tylko parsowania obiektu/tablic json najwyższego poziomu i analizowanie poszczególnych wartości. Użyj go z attoparsec. –