3

我有以下代码:

data Friend = Friend
              { friend_name :: Text
              , friend_inTwitter :: Bool
              , friend_twitterName :: Maybe Text
              }
$(deriveJSON (drop 6) ''Friend)

这段 JSON 被发布到一个处理程序,我很难得到它。我尝试了不同的东西,但让我把其中一个放在这里以产生建议:

postTestR :: Handler RepPlain
postTestR = do
value <- parseJsonBody_
return $ RepPlain $ friend_name value

这不起作用,我可以看到类型不匹配,但我不确定用什么替换它。我还想看看如何解析以 JSON 形式发布的好友列表。

谢谢!

4

2 回答 2

5

好吧,事实证明,我需要在其中添加一个“toContent”调用以将文本转换为内容。这是一段有效的代码:

data Person = Person
              { person_firstName :: Text
              , person_lastName :: Text
              , person_fullName :: Text
              , person_friends :: [Friend]
              }

data Friend = Friend
              { friend_name :: Text
              , friend_inTwitter :: Bool
              , friend_twitterName :: Text
              }


$(deriveJSON (drop 7) ''Person)              
$(deriveJSON (drop 7) ''Friend)   


postKnockoutR :: Handler RepPlain
postKnockoutR = do
  value <- parseJsonBody_
  let (f:fs) = person_friends value
  return $ RepPlain $ toContent $ friend_name f
于 2012-05-30T19:46:27.587 回答
0

我不是 Yesod 专家,但是如果您查看 的返回类型parseJsonBody_,您会发现它是FromJSON a => GHandler sub master a,而不仅仅是普通的FromJSON a => a。这是有道理的:您无法在请求可访问的 HTTP 上下文之外解析请求正文,并且由于 HTTP 上下文是作为 monad 实现的,因此您必须编写 monadic 代码来处理它。

因此,您可能希望从 Handler monad 中提取 JSON 值,而不是赋值:

value <- parseJsonBody_

在您的代码中,value是 type GHandler sub master Friend,这不是您想要的。

于 2012-05-30T18:55:29.017 回答