12

aeson に UTCTime 値を解析させることができません。1つをエンコードしてフィードバックしようとしましたが、うまくいきませんでした:

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

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"

ここにあるフォーマットの説明に従えば、すべて問題ないはずです。私は何が欠けていますか?

4

1 に答える 1

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

ハドックの「落とし穴」セクションに注意してください。

JSON 標準では、最上位の値が配列またはオブジェクトである必要があることに注意してください。JSON で配列またはオブジェクトとして表されない結果の型で decode を使用しようとすると、コードは型チェックを行いますが、実行時に常に「失敗」します。

...

したがって、オブジェクト (Haskell のマップなど) または配列 (Haskell のリストまたはベクトル) に固執します。

于 2013-10-17T10:11:04.187 に答える