2012-05-30 2 views
2

У меня есть следующий фрагмент кода:Синтаксический пост 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.

Спасибо!

ответ

4

Ну, как оказалось, мне нужно было добавить вызов «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 
0

Я не эксперт по Yesod, но если вы посмотрите на возвращаемый тип parseJsonBody_, вы увидите, что это FromJSON a => GHandler sub master a, а не просто FromJSON a => a. Это имеет смысл: вы не можете разобрать тело запроса вне контекста HTTP, в котором этот запрос доступен, и поскольку контекст HTTP реализован как монада, вам придется писать монадический код, чтобы справиться с ним.

Таким образом, вместо задания, вы, вероятно, хотите, чтобы извлечь значение JSON из монады Handler:

value <- parseJsonBody_ 

В коде value имеет тип GHandler sub master Friend, который не то, что вы хотите.

+0

Извините, я хотел сказать: значение <- parseJsonBody_, но каким-то образом его испортил. Я вернулся и отредактировал сообщение. – Daniel

Смежные вопросы