如何从Yesod中的JSON操纵数据



如果我有此代码,我如何更改从邮政请求发送的JSON的年龄,然后返回?我对Haskell的一般经验真的很差,所以我不知道我的问题是否来自在语言本身的Yesod框架中缺乏知识。

{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}
module Handler.Home where
import Data.Aeson
import Data.Text (Text)
import Yesod

data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET POST
|]
instance Yesod HelloWorld
data Person = Person
    { name :: Text
    , age :: Int
    } deriving (Eq, Show)
instance ToJSON Person where
    toJSON (Person n a)  = object
        [ "name" .= n
        , "age"  .= a
        ]
instance FromJSON Person where
    parseJSON = withObject "Person" $ v -> Person
        <$> v .: "name"
        <*> v .: "age"
getHomeR :: Handler Value
getHomeR = returnJson $ Person "Rafael" 21

postHomeR :: Handler Value
postHomeR = do
    json_payload <- requireJsonBody :: Handler Person
    returnJson json_payload
main :: IO ()
main = warp 3000 HelloWorld

json_payloadPerson,因此您只需使用记录更新语法。
例如,值json_payload { age = 32 }具有json_payload的所有字段,除了age字段为32。

因此,您可以将postHomeR重写为

postHomeR = do
  json_payload <- requireJsonBody :: Handler Person
  let modified = json_payload { age = 32 }
  returnJson modified

postHomeR = do
  json_payload <- requireJsonBody :: Handler Person
  returnJson (json_payload { age = 32 })

不需要括号,但我认为这使它更清晰,而不是必须去检查优先级的语法规则。

最新更新