Парсинг сообщения JSON
У меня есть следующий кусок кода:
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 ответа
Ну, как оказалось, мне нужно было добавить туда вызов 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
Я не эксперт по Yesod, но если вы посмотрите на тип возврата parseJsonBody_
вы увидите, что это FromJSON a => GHandler sub master a
не просто FromJSON a => a
, Это имеет смысл: вы не можете анализировать тело запроса вне контекста HTTP, в котором запрос доступен, и, поскольку контекст HTTP реализован как монада, вам придется написать монадический код для его обработки.
Поэтому вместо присваивания вы, вероятно, захотите извлечь значение JSON из монады Handler:
value <- parseJsonBody_
В вашем коде value
имеет тип GHandler sub master Friend
что не то, что вы хотите.