【问题标题】:Set default values in FromJSON在 FromJSON 中设置默认值
【发布时间】: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

但是,它无法编译,我不确定如何填充 createduser 默认值。

【问题讨论】:

  • 您在解码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 变得非常简单和轻松。

标签: haskell yesod


【解决方案1】:

感谢@basile-henry 提供的answers,这就是我的结局

--Models.hs

-- A Bid type that represents the data we will get from JSON.
data SemiBid = SemiBid
  { semiBidPrice :: Int
  }

instance FromJSON SemiBid where
  parseJSON (Object v) =
     SemiBid <$> v .: "price"
  parseJSON _ = mzero

然后在我的POST 处理程序中:

postRestfulBidsR :: Handler Value
postRestfulBidsR = do
    currentTime <- liftIO getCurrentTime
    userId <- requireAuthId

    semiBid <- requireJsonBody :: Handler SemiBid
    let bid = Bid
          { bidPrice = semiBidPrice semiBid
          , bidCreated = currentTime
          , bidBidder = userId
          }

    bidId   <- runDB $ insert bid

    -- ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多