【问题标题】:Haskell read nested timestamp from YAML fileHaskell 从 YAML 文件中读取嵌套时间戳
【发布时间】:2017-03-02 15:33:09
【问题描述】:

我最近开始玩 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”。

【问题讨论】:

  • 我看到的第一个问题是你必须大写你的类型和构造函数,所以data Item = Item ...instance FromJSON Item where ...。我认为您的问题实际上是关于如何访问嵌套元素,这是您真正想问的吗?这个问题似乎并不是真正关于获取时间戳,而是关于如何在 YAML 中使用嵌套结构。
  • @bheklilr 感谢您的回复,是的,您是对的。问题确实应该是:“如何访问嵌套元素?”
  • 你在使用the yaml package吗?如果是这样,您应该在问题中提及它。 (对了,你可以edit添加说明。)
  • @duplode 是的,我正在使用 yaml 包。我已将此添加到问题中。
  • @QuickQuestionGuy 欢迎来到Stack Overflow,我们有编辑历史记录。当您更改某些内容时,无需通过在帖子本身中包含“编辑”来降低您的帖子对未来用户的可读性。

标签: haskell yaml aeson


【解决方案1】:

最简单的方法是创建一个实现FromJSONnewtype

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"

希望对您有所帮助。

【讨论】:

  • 值得注意的是UTCTime has a FromJSON instance,因此在Time 的定义中将String 替换为UTCTime 将可以正常工作,无需进一步更改。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 2019-01-09
  • 2015-05-10
  • 2023-03-10
  • 1970-01-01
  • 2019-01-24
  • 2013-06-01
  • 2016-09-08
相关资源
最近更新 更多