如何使用json对日期字段进行反序列化

时间:2017-12-07 10:11:58

标签: haskell aeson

我需要定义具有date字段的数据类型并从json反序列化它。这是我的尝试。

data Some = Some { date :: Data.Time.Calendar.Day } deriving (Show, Generic) 

instance FromJSON Day where
     parseJSON (Object x) = parseTimeM True defaultTimeLocale "%F" <$> x .: (pack "date") 

这是错误。

• Couldn't match type ‘m0 t0’ with ‘Day’
  Expected type: aeson-1.2.3.0:Data.Aeson.Types.Internal.Parser Day
    Actual type: aeson-1.2.3.0:Data.Aeson.Types.Internal.Parser
                   (m0 t0)
• In the expression:
    parseTimeM True defaultTimeLocale "%F" <$> x .: (pack "date")
  In an equation for ‘parseJSON’:
      parseJSON (Object x)
        = parseTimeM True defaultTimeLocale "%F" <$> x .: (pack "date")
  In the instance declaration for ‘FromJSON Day’

我觉得很奇怪,我找不到任何带有暴露构造函数的数据类型来创建Date个对象。而且我找不到从Date

解析String的函数

2 个答案:

答案 0 :(得分:3)

以供参考,一个完整的代码示例:

try

答案 1 :(得分:1)

parseTimeM的类型为(Monad m, ParseTime t) => ... -> m t,如果您专注于Day,则为... -> m Day,因此您需要链接monadic操作(使用m ~ Parser)或以某种方式解开m(例如,m ~ Maybe)。

(x .: pack "date") >>= parseTimeM True defaultTimeLocale "%F"

此外,Day已有一个实例,可解析YYYY-MM-DD格式。