【发布时间】:2017-04-10 18:52:56
【问题描述】:
我想为我拥有的模型设置默认值
-- models
Bid
price Int
created UTCTime
user UserId
deriving Eq Show Generic
我希望user 属性由当前用户设置,但以下不起作用:
instance FromJSON Bid where
parseJSON (Object v) =
Bid <$> v .: "price"
<*> getCurrentTime -- "created" property.
<*> requireAuthId -- "user" property.
parseJSON _ = mzero
但是,它无法编译,我不确定如何填充 created 和 user 默认值。
【问题讨论】:
-
您在解码
JSON时是否尝试做一些IO(花时间并获得一些身份验证)?也许您应该尝试将JSON解码与创建模型所需的IO分开。您可以为JSON对象创建一个中间模型。 -
哦,你的意思是只有
price和我的处理程序中的SemiBid,然后在我的处理程序中构建一个完整的Bid和所有IO属性? -
好吧,
price以及来自JSON的任何东西。您应该在 Haskell 中有一个类型,该类型准确地表示您希望JSON解析器遇到的那种值。而已!如果您只对来自JSON的值的子集感兴趣,那很好,只解析您感兴趣的值。然后,如果您想将此数据用作更大模型的一部分,请不假思索地在 Haskell 中创建该逻辑关于JSON。您需要解耦不同的关注点:-) -
只解析我感兴趣的内容是什么意思?你的意思是让它们在 FromJSON 中是可选的,并在我的处理程序中覆盖它们?另外,我尝试了另一种较小的类型,效果很好。感谢您的想法!
-
我不知道您使用的是什么
JSON模型,但通常存在您的应用程序不感兴趣的数据。在这种情况下,不需要在JSON对象的 Haskell 表示中为其创建一个字段。这就是我的意思。如果您自己创建了JSON模型并且拥有您需要的所有字段,那么请务必:解析它们! :-) 对于最简单的JSON解析,我建议使用来自 aeson 的 Template Haskell 函数。它使解析和生成JSON变得非常简单和轻松。