我有以下代码:
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的朋友列表。
谢谢!
答案 0 :(得分:4)
嗯,事实证明,我需要在那里添加一个“toContent”调用,以便从Text转换为Content。这是一段有用的代码:
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
答案 1 :(得分:0)
我不是Yesod专家,但是如果你看一下parseJsonBody_
的返回类型,你会发现它是FromJSON a => GHandler sub master a
,而不仅仅是FromJSON a => a
。这是有道理的:您无法在可以访问请求的HTTP上下文之外解析请求主体,并且由于HTTP上下文是作为monad实现的,因此您必须编写monadic代码来处理它。
因此,您可能希望从Handler monad中提取JSON值而不是赋值:
value <- parseJsonBody_
在您的代码中,value
的类型为GHandler sub master Friend
,这不是您想要的。