Парсинг сообщения 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что не то, что вы хотите.

Другие вопросы по тегам