2013-10-17 14 views
11

私はaesonを取得してUTCTime値を解析できません。私は1つをコードし、それをフィードバックすることを試みたが、それは動作しませんでした:見出さフォーマット記述以下aesonでutctimeを解析する

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" 

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 

UTC時刻型のFromJSONインスタンスは、以下の(ref)でありますhere、すべてが正常である必要があります。私は何が欠けていますか?

答えて

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

注haddocksにおける「落とし穴」セクション:

注JSON標準は最上位の値が 配列またはオブジェクトのいずれかであることが必要であること。あなたは配列やオブジェクトとしてJSONで表現されていない結果 タイプとデコードを使用しようとすると、あなたのコード はです。TypeCheckますが、それは常に、実行時に「失敗」します:

を...

だから、オブジェクト(Haskellでは例えばマップ)または(Haskellではリストやベクトル)の配列に固執:

+0

私は、このセクションを読んでいました。しかし、私の脳はつながりませんでした。ありがとう! – Simon

+0

これを回避するための実用的なトリックは、あなたのタイプをリストレイヤーでラップすることです: 'Decode" ... ":: FromJSON a =>たぶん[a]'。私はサブパーザルを素早くチェックするためにこれを常に使用しています。非標準のJSONの動作を得るために内部のAesonパーサーを再配線しようとするよりもずっと簡単です。 –

+2

'Data.Aeson.Parser'の' value'パーサを使うと、その仕様を上書きすることができます。トップレベルのjsonオブジェクト/配列の解析のみを要求し、個々の値を解析します。 attoparsecで使用してください。 –