Разбор сообщения 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.

Спасибо!


person Daniel    schedule 30.05.2012    source источник


Ответы (2)


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

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

Поэтому вместо присваивания вы, вероятно, захотите извлечь значение JSON из монады Handler:

value <- parseJsonBody_

В вашем коде value имеет тип GHandler sub master Friend, а это не то, что вам нужно.

person tdammers    schedule 30.05.2012
comment
Извините, я хотел сказать: значение ‹- parseJsonBody_, но как-то опечатался. Я вернулся и отредактировал пост. - person Daniel; 30.05.2012