解析JSON帖子

时间:2012-05-30 18:32:59

标签: yesod

我有以下代码:

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的朋友列表。

谢谢!

2 个答案:

答案 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,这不是您想要的。