3

私は次のコードを持っています:

data Friend = Friend
              { friend_name :: Text
              , friend_inTwitter :: Bool
              , friend_twitterName :: Maybe Text
              }
$(deriveJSON (drop 6) ''Friend)

このJSONはハンドラーに投稿されており、取得するのに苦労しています。私はさまざまなことを試しましたが、提案を生成するためにそれらの1つをここに配置します。

postTestR :: Handler RepPlain
postTestR = do
value <- parseJsonBody_
return $ RepPlain $ friend_name value

それは機能せず、タイプが一致していないことはわかりますが、何に置き換えるかはわかりません。また、JSONとして投稿された友達のリストを解析する方法も知りたいです。

ありがとう!

4

2 に答える 2

5

実は、テキストからコンテンツに変換するには、そこに「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
于 2012-05-30T19:46:27.587 に答える
0

私はYesodの専門家ではありませんが、のリターンタイプを見ると、単なるプレーンではなく、parseJsonBody_それであることがわかります。これは理にかなっています。リクエストにアクセスできるHTTPコンテキストの外部でリクエスト本文を解析することはできません。また、HTTPコンテキストはモナドとして実装されているため、それを処理するためにモナドコードを記述する必要があります。FromJSON a => GHandler sub master aFromJSON a => a

したがって、割り当ての代わりに、ハンドラモナドからJSON値を抽出することをお勧めします。

value <- parseJsonBody_

あなたのコードでvalueは、はタイプですがGHandler sub master Friend、これはあなたが望むものではありません。

于 2012-05-30T18:55:29.017 に答える