Haskell从YAML文件中读取嵌套时间戳

时间:2017-03-02 15:33:09

标签: haskell yaml aeson

我最近开始玩Haskell,似乎无法解决这个问题。

我正在尝试从具有以下格式的YAML文件中读取:

id: 1
kind: good
created_at: !ruby/object:ActiveSupport::TimeWithZone
    utc: &1 2017-01-01 10:34:12.533704000 Z
    zone: &2 !ruby/object:ActiveSupport::TimeZone
    time: *2

到目前为止,我可以通过这样做来完整地阅读id和kind:

data Item= Item{
    id :: Integer,
    kind::String
    }

instance FromJSON Item where
    parseJSON(Object v) = Item <$>
        v .: "id" <*>
        v .: "kind"

我正在使用“Data.Yaml”包和这个功能:
    let items = Data.Yaml.decode ymlData :: Maybe[Item]

但我似乎无法弄清楚如何获得时间戳。

获取时间戳的正确方法是什么,只需要“utc”。

1 个答案:

答案 0 :(得分:2)

最简单的方法是创建一个newtype来实现FromJSON

import Data.Time
import Data.Yaml

data Item = Item 
  { id :: Int
  , kind :: String
  , createdAt :: UTCTime
  } deriving (Show)

instance FromJSON Item where
  parseJSON (Object v) = 
    Item <$> v .: "id" <*> v .: "kind" <*> v .: "created_at"

newtype Time = Time String deriving (Show, Eq)

instance FromJSON Time where
  parseJSON (Object v) = Time <$> v .: "utc"

希望有所帮助。